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

Artifact 5f4a9396fc3b4f1d24224a4842737e708b13fb61:


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 34  select.c,v 1.264
0200: 20 32 30 30 35 2f 30 39 2f 30 38 20 30 30 3a 31   2005/09/08 00:1
0210: 33 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a 2a  3:28 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 26 26 20  ->iOffset>=0 && 
2ae0: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
2af0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
2b00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2b10: 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
2b20: 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61    if( nPop>0 ) a
2b30: 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  ddr++;.    sqlit
2b40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2b50: 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f  P_MemIncr, p->iO
2b60: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
2b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2b80: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
2b90: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
2ba0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e  );.    if( nPop>
2bb0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2bc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2bd0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
2be0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2bf0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2c00: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
2c10: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
2c20: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
2c30: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
2c40: 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  s"));.  }.  if( 
2c50: 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20  p->iLimit>=0 && 
2c60: 69 42 72 65 61 6b 21 3d 30 20 29 7b 0a 20 20 20  iBreak!=0 ){.   
2c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c80: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2c90: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
2ca0: 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ak);.    VdbeCom
2cb0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 78 69 74  ment((v, "# exit
2cc0: 20 77 68 65 6e 20 4c 49 4d 49 54 20 72 65 61 63   when LIMIT reac
2cd0: 68 65 64 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hed"));.  }.}../
2ce0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2cf0: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
2d00: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73  code for the ins
2d10: 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ide of the inner
2d20: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45   loop.** of a SE
2d30: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  LECT..**.** If s
2d40: 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d  rcTab and nColum
2d50: 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c  n are both zero,
2d60: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
2d70: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
2d80: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
2d90: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
2da0: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
2db0: 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e  row.  If nColumn
2dc0: 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20  >0.** then data 
2dd0: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
2de0: 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74  rcTab and pEList
2df0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2e00: 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   get the.** data
2e10: 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63  types for each c
2e20: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
2e30: 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72   int selectInner
2e40: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
2e50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
2e60: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
2e70: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
2e80: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
2e90: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
2ea0: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
2eb0: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
2ec0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
2ed0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
2ee0: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
2ef0: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
2f00: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f20: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
2f30: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
2f40: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
2f50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f60: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
2f70: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
2f80: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
2f90: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
2fa0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
2fb0: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
2fc0: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
2fd0: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
2fe0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
2ff0: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
3000: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
3010: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3030: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
3040: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
3050: 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
3060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
3070: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3080: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
3090: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
30a0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
30b0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
30c0: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
30d0: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
30e0: 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  eak,            
30f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
3100: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
3110: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
3120: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
3130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66            /* aff
3140: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20  inity string if 
3150: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
3160: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  on */.){.  Vdbe 
3170: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
3180: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
3190: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
31a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31b0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
31c0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
31d0: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30  t */..  if( v==0
31e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
31f0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
3200: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
3210: 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63  re was a LIMIT c
3220: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c  lause on the SEL
3230: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
3240: 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b  hen do the check
3250: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
3260: 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20  this row should 
3270: 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
3280: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
3290: 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70  distinct>=0 && p
32a0: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
32b0: 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20  >nExpr>0;.  if( 
32c0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
32d0: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
32e0: 20 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76     codeLimiter(v
32f0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  , p, iContinue, 
3300: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 7d 0a  iBreak, 0);.  }.
3310: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
3320: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
3330: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f  ..  */.  if( nCo
3340: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
3350: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
3360: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
3370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3380: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
3390: 54 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  Tab, i);.    }. 
33a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
33b0: 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  umn = pEList->nE
33c0: 78 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xpr;.    sqlite3
33d0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
33e0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 29  (pParse, pEList)
33f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
3400: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
3410: 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20  ord was present 
3420: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
3430: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64  atement.  ** and
3440: 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65   this row has be
3450: 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20  en seen before, 
3460: 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65  then do not make
3470: 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70   this row.  ** p
3480: 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  art of the resul
3490: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  t..  */.  if( ha
34a0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
34b0: 20 69 6e 74 20 6e 20 3d 20 70 45 4c 69 73 74 2d   int n = pEList-
34c0: 3e 6e 45 78 70 72 3b 0a 23 69 66 20 4e 55 4c 4c  >nExpr;.#if NULL
34d0: 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54  _ALWAYS_DISTINCT
34e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
34f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75  AddOp(v, OP_IsNu
3500: 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78  ll, -pEList->nEx
3510: 70 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  pr, sqlite3VdbeC
3520: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29  urrentAddr(v)+7)
3530: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
3540: 44 65 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61  Deliberately lea
3550: 76 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ve the affinity 
3560: 73 74 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68  string off of th
3570: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
3580: 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  ** OP_MakeRecord
3590: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
35a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
35b0: 61 6b 65 52 65 63 6f 72 64 2c 20 2d 6e 2c 20 30  akeRecord, -n, 0
35c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
35d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69  beAddOp(v, OP_Di
35e0: 73 74 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74  stinct, distinct
35f0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3600: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
3610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3620: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
3630: 6e 2b 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  n+1, 0);.    sql
3640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3650: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
3660: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
3670: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
3680: 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20  skip indistinct 
3690: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
36a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36b0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
36c0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a  , distinct, 0);.
36d0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
36e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
36f0: 65 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69  eLimiter(v, p, i
3700: 43 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b  Continue, iBreak
3710: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
3720: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
3730: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
3740: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
3750: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
3760: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
3770: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
3780: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
3790: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
37a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37b0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
37c0: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
37d0: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71  nion: {.      sq
37e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
3800: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
3810: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
3820: 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29  .      if( aff )
3830: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3840: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
3850: 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41   -1, aff, P3_STA
3860: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
3870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3880: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
3890: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
38a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
38b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
38c0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
38d0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
38e0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
38f0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
3900: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
3910: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
3920: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
3930: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
3940: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
3950: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
3960: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
3970: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
3980: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
3990: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
39a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
39b0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
39c0: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
39d0: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71  TINCT);.      sq
39e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
39f0: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
3a00: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
3a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3a20: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
3a30: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
3a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3a50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
3a60: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b  lete, iParm, 0);
3a70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3a80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
3a90: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
3aa0: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
3ab0: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
3ac0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3ad0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
3ae0: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
3af0: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
3b00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3b10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3b20: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3b30: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3b40: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3b50: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3b60: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3b70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3b90: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
3ba0: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
3bb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3bc0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3bd0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
3be0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3bf0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  dOp(v, OP_Insert
3c00: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
3c10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3c20: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
3c30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3c40: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
3c50: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
3c60: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
3c70: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
3c80: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
3c90: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
3ca0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
3cb0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
3cc0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
3cd0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
3ce0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
3cf0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
3d00: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
3d10: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
3d20: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
3d30: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3d40: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
3d50: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
3d60: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
3d70: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
3d80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3d90: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
3da0: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
3db0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3dc0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
3dd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
3de0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3df0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3e00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
3e10: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
3e20: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
3e30: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
3e40: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
3e50: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
3e60: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
3e70: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
3e80: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
3e90: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
3ea0: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
3eb0: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
3ec0: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
3ed0: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
3ee0: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
3ef0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
3f00: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
3f10: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
3f20: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
3f30: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
3f40: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
3f50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
3f60: 61 72 20 61 66 66 20 3d 20 28 69 50 61 72 6d 3e  ar aff = (iParm>
3f70: 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20  >16)&0xFF;.     
3f80: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
3f90: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
3fa0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
3fb0: 70 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20  pr, aff);.      
3fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
3fd0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3fe0: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 2c 20 31  d, 1, 0, &aff, 1
3ff0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4000: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4010: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50  P_IdxInsert, (iP
4020: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
4030: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4050: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c  angeP2(v, addr2,
4060: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4070: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
4080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4090: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
40a0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
40b0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
40c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
40d0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
40e0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
40f0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
4100: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
4110: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
4120: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
4130: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
4140: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
4150: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  :.    case SRT_M
4160: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4170: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4180: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4190: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
41a0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
41b0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
41c0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
41d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
41e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
41f0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4200: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
4210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4220: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
4230: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  reak);.      }. 
4240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4250: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
4260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4270: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
4280: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
4290: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
42a0: 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f  k function or to
42b0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20   a subroutine.  
42c0: 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  In the.    ** ca
42d0: 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  se of a subrouti
42e0: 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ne, the subrouti
42f0: 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73  ne itself is res
4300: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20  ponsible for.   
4310: 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20   ** popping the 
4320: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74  data from the st
4330: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
4340: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
4350: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
4360: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
4370: 63 61 73 65 20 53 52 54 5f 53 6f 72 74 65 72 3a  case SRT_Sorter:
4380: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
4390: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
43a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
43b0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
43c0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
43d0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
43e0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
43f0: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
4400: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
4410: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
4420: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
4430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4440: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
4450: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
4460: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
4470: 65 72 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f  ert( eDest!=SRT_
4480: 53 6f 72 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Sorter );.      
4490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
44a0: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
44b0: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
44c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
44d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
44e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
44f0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
4500: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
4510: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
4520: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
4530: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
4540: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
4550: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
4560: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
4570: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
4580: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
4590: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
45a0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
45b0: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
45c0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
45d0: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
45e0: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
45f0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
4600: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
4610: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
4620: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
4630: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
4640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4650: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
4660: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  umn, 0);.      b
4670: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4680: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
4690: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
46a0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
46b0: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
46c0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
46d0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
46e0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
46f0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
4700: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
4710: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
4720: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
4730: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
4740: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
4750: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
4760: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
4770: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
4780: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
4790: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
47a0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
47b0: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
47c0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
47d0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
47e0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
47f0: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
4800: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
4810: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4820: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
4830: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
4840: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
4850: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
4860: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
4870: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
4880: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
4890: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
48a0: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
48b0: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
48c0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
48d0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
48e0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
48f0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
4900: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
4910: 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e  .  Add the KeyIn
4920: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
4930: 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20  the P3 field of 
4940: 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a  an opcode using.
4950: 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  ** P3_KEYINFO_HA
4960: 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75  NDOFF is the usu
4970: 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e  al way of dealin
4980: 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a  g with this..*/.
4990: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
49a0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
49b0: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
49c0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
49d0: 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  st){.  sqlite3 *
49e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
49f0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
4a00: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
4a10: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
4a20: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
4a30: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
4a40: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
4a50: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
4a60: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
4a70: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
4a80: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
4a90: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
4aa0: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
4ab0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
4ac0: 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e 61 43  char*)&pInfo->aC
4ad0: 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20  oll[nExpr];.    
4ae0: 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  pInfo->nField = 
4af0: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
4b00: 2d 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b  ->enc = db->enc;
4b10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
4b20: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
4b30: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
4b40: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
4b50: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
4b60: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
4b70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4b80: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
4b90: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
4ba0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
4bb0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
4bc0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
4bd0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
4be0: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
4bf0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
4c00: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
4c10: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
4c20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4c30: 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pInfo;.}.../*.**
4c40: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
4c50: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
4c60: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
4c70: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
4c80: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
4c90: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
4ca0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
4cb0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
4cc0: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
4cd0: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
4ce0: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
4cf0: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
4d00: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
4d10: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
4d20: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
4d30: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
4d40: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
4d50: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
4d60: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
4d70: 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65 20  Parse,   /* The 
4d80: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
4d90: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
4da0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
4db0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
4dc0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
4dd0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
4de0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
4df0: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
4e00: 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  lumn,     /* Num
4e10: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
4e20: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
4e30: 65 44 65 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eDest,       /* 
4e40: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
4e50: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
4e60: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 20 20 20  .  int iParm    
4e70: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
4e80: 70 61 72 61 6d 65 74 65 72 20 61 73 73 6f 63 69  parameter associ
4e90: 61 74 65 64 20 77 69 74 68 20 65 44 65 73 74 20  ated with eDest 
4ea0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20  */.){.  int brk 
4eb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4ec0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
4ed0: 20 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56   cont = sqlite3V
4ee0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4ef0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
4f00: 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c  nt iTab;.  ExprL
4f10: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
4f20: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
4f30: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
4f40: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
4f50: 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42    iTab = pOrderB
4f60: 79 2d 3e 69 54 61 62 3b 0a 20 20 61 64 64 72 20  y->iTab;.  addr 
4f70: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
4f80: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
4f90: 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20  t, iTab, brk);. 
4fa0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20   codeLimiter(v, 
4fb0: 70 2c 20 63 6f 6e 74 2c 20 62 72 6b 2c 20 30 29  p, cont, brk, 0)
4fc0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4fd0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
4fe0: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
4ff0: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20  y->nExpr + 1);. 
5000: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
5010: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
5020: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5030: 52 54 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a  RT_TempTable: {.
5040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77  eAddOp(v, OP_New
5060: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29  Rowid, iParm, 0)
5070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5080: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
5090: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
50a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
50b0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
50c0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
50d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
50e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
50f0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
5100: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
5110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5120: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5140: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  Op(v, OP_NotNull
5150: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64 62  , -1, sqlite3Vdb
5160: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
5170: 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
5180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5190: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
51a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
51b0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
51c0: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
51d0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
51e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
51f0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
5200: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e  Record, 1, 0, "n
5210: 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
5220: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5230: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
5240: 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78  nsert, (iParm&0x
5250: 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20  0000FFFF), 0);. 
5260: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5270: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  }.    case SRT_E
5280: 78 69 73 74 73 3a 0a 20 20 20 20 63 61 73 65 20  xists:.    case 
5290: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
52a0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
52b0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
52c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
52d0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
52e0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  arm, 1);.      s
52f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5300: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62  v, OP_Goto, 0, b
5310: 72 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rk);.      break
5320: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
5330: 20 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c     case SRT_Call
5340: 62 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53  back:.    case S
5350: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b  RT_Subroutine: {
5360: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
5370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5380: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
5390: 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  er, p->pEList->n
53a0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
53b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
53c0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
53d0: 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
53e0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
53f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
5400: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5410: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c  OP_Column, -1-i,
5420: 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
5430: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
5440: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
5450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5460: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c  eAddOp(v, OP_Cal
5470: 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  lback, nColumn, 
5480: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
5490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
54a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
54b0: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
54c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
54d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54e0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
54f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5500: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
5510: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
5520: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
5530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
5550: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
5560: 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  cont);.  sqlite3
5570: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5580: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
5590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
55a0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
55b0: 62 72 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  brk);.}../*.** R
55c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
55d0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
55e0: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
55f0: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
5600: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
5610: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
5620: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
5630: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
5640: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
5650: 2a 2a 20 49 66 20 74 68 65 20 64 65 63 6c 61 72  ** If the declar
5660: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
5670: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
5680: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
5690: 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  acted from.** th
56a0: 65 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  e original CREAT
56b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
56c0: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
56d0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
56e0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
56f0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
5700: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
5710: 73 20 65 69 74 68 65 72 20 54 45 58 54 2c 20 4e  s either TEXT, N
5720: 55 4d 45 52 49 43 20 6f 72 20 41 4e 59 2e 0a 2a  UMERIC or ANY..*
5730: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
5740: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
5750: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
5760: 47 45 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  GER..*/.static c
5770: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
5780: 6e 54 79 70 65 28 4e 61 6d 65 43 6f 6e 74 65 78  nType(NameContex
5790: 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
57a0: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  xpr){.  char con
57b0: 73 74 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74  st *zType;.  int
57c0: 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d   j;.  if( pExpr=
57d0: 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  =0 || pNC->pSrcL
57e0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
57f0: 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54 4b 5f  0;..  /* The TK_
5800: 41 53 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20  AS operator can 
5810: 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f 52  only occur in OR
5820: 44 45 52 20 42 59 2c 20 47 52 4f 55 50 20 42 59  DER BY, GROUP BY
5830: 2c 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a 20 61  , HAVING,.  ** a
5840: 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 73  nd LIMIT clauses
5850: 2e 20 20 42 75 74 20 70 45 78 70 72 20 6f 72 69  .  But pExpr ori
5860: 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 72  ginates in the r
5870: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 0a 20  esult set of a. 
5880: 20 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53 6f 20   ** SELECT.  So 
5890: 70 45 78 70 72 20 63 61 6e 20 6e 65 76 65 72 20  pExpr can never 
58a0: 63 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20 6f 70  contain an AS op
58b0: 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61  erator..  */.  a
58c0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
58d0: 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20 73 77  !=TK_AS );..  sw
58e0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
58f0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
5900: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 54  OLUMN: {.      T
5910: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
5920: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
5930: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
5940: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
5950: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
5960: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
5970: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
5980: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
5990: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
59a0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
59b0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
59c0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
59d0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
59e0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
59f0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
5a00: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
5a10: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
5a20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5a30: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
5a40: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
5a50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5a60: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
5a70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20  .        /* FIX 
5a80: 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ME:.        ** T
5a90: 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73 20 69  his can occurs i
5aa0: 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d 65 74  f you have somet
5ab0: 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c 45 43  hing like "SELEC
5ac0: 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69 64 65  T new.x;" inside
5ad0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72  .        ** a tr
5ae0: 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68 65 72  igger.  In other
5af0: 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75 20 72   words, if you r
5b00: 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 70 65  eference the spe
5b10: 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20 20 20  cial "new".     
5b20: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74     ** table in t
5b30: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5b40: 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65 20 64   a select.  We d
5b50: 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67 6f 6f  o not have a goo
5b60: 64 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a  d way.        **
5b70: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61 63 74   to find the act
5b80: 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65 2c 20  ual table type, 
5b90: 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45 58 54  so call it "TEXT
5ba0: 22 2e 20 20 54 68 69 73 20 69 73 20 72 65 61 6c  ".  This is real
5bb0: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  ly.        ** so
5bc0: 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62 75 67  mething of a bug
5bd0: 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b  , but I do not k
5be0: 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78 20 69  now how to fix i
5bf0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t..        **.  
5c00: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
5c10: 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64  de does not prod
5c20: 75 63 65 20 74 68 65 20 63 6f 72 72 65 63 74 20  uce the correct 
5c30: 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75 73 74  answer - it just
5c40: 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20 20 20   prevents.      
5c50: 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c 74 2e    ** a segfault.
5c60: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 31 32    See ticket #12
5c70: 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  29..        */. 
5c80: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
5c90: 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20 20 62  TEXT";.        b
5ca0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5cb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
5cc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
5cd0: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
5ce0: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
5cf0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
5d00: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
5d10: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
5d20: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
5d30: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
5d40: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
5d50: 52 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  R";.      }else{
5d60: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
5d70: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
5d80: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 7d  ].zType;.      }
5d90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5da0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
5db0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5dc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
5dd0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 4e 61 6d  ECT: {.      Nam
5de0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
5df0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
5e00: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
5e10: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
5e20: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  ist = pExpr->pSe
5e30: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
5e40: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
5e50: 43 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  C;.      zType =
5e60: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
5e70: 2c 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  , pS->pEList->a[
5e80: 30 5d 2e 70 45 78 70 72 29 3b 20 0a 20 20 20 20  0].pExpr); .    
5e90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5ea0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
5eb0: 74 3a 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  t:.      zType =
5ec0: 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74   0;.  }.  .  ret
5ed0: 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a  urn zType;.}../*
5ee0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
5ef0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
5f00: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65   the VDBE the de
5f10: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20  claration types 
5f20: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
5f30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
5f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f50: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
5f60: 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pes(.  Parse *pP
5f70: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
5f80: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5f90: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
5fa0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
5fb0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
5fc0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
5fd0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
5fe0: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
5ff0: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
6000: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6010: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
6020: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
6030: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
6040: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
6050: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
6060: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
6070: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
6080: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
6090: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
60a0: 61 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75  ar *zType = colu
60b0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 29 3b  mnType(&sNC, p);
60c0: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 3d 3d  .    if( zType==
60d0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
60e0: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
60f0: 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e  st make it's own
6100: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
6110: 75 6d 6e 2d 74 79 70 65 2c 20 69 6e 20 63 61 73  umn-type, in cas
6120: 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 63  e the .    ** sc
6130: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
6140: 66 6f 72 65 20 74 68 69 73 20 76 69 72 74 75 61  fore this virtua
6150: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
6160: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
6170: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6180: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b 70 45 4c 69  olName(v, i+pELi
6190: 73 74 2d 3e 6e 45 78 70 72 2c 20 7a 54 79 70 65  st->nExpr, zType
61a0: 2c 20 73 74 72 6c 65 6e 28 7a 54 79 70 65 29 29  , strlen(zType))
61b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
61c0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
61d0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
61e0: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
61f0: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
6200: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
6210: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
6220: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
6230: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
6240: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
6250: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
6260: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
6270: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
6280: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6290: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
62a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
62b0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
62c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
62d0: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
62e0: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
62f0: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
6300: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
6310: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
6320: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
6330: 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  be;.  int i, j;.
6340: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6350: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
6360: 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f  t fullNames, sho
6370: 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65  rtNames;..#ifnde
6380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
6390: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
63a0: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
63b0: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
63c0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
63d0: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
63e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
63f0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 76  dif..  assert( v
6400: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
6410: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
6420: 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 73 71 6c 69   || v==0 || sqli
6430: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
6440: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  d ) return;.  pP
6450: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
6460: 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
6470: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
6480: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
6490: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f  Names)!=0;.  sho
64a0: 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  rtNames = (db->f
64b0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
64c0: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ortColNames)!=0;
64d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
64e0: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
64f0: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
6500: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
6510: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6520: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70    Expr *p;.    p
6530: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
6540: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
6550: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
6560: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
6570: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
6580: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
6590: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
65a0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
65b0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
65c0: 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 73  e(v, i, zName, s
65d0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20  trlen(zName));. 
65e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
65f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
6600: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
6610: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
6620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
6630: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
6640: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
6650: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
6660: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6670: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
6680: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
6690: 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61  .iCursor!=p->iTa
66a0: 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ble; j++){}.    
66b0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62    assert( j<pTab
66c0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
66d0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
66e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
66f0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
6700: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
6710: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
6720: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
6730: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
6740: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
6750: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
6760: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
6770: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
6780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6790: 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61    zCol = pTab->a
67a0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
67b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
67c0: 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  f( !shortNames &
67d0: 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26 20  & !fullNames && 
67e0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
67f0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
6800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6810: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
6820: 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73   p->span.z, p->s
6830: 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pan.n);.      }e
6840: 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65  lse if( fullName
6850: 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65  s || (!shortName
6860: 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s && pTabList->n
6870: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
6880: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
6890: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
68a0: 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20  *zTab;. .       
68b0: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
68c0: 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[j].zAlias;. 
68d0: 20 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e         if( fullN
68e0: 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20  ames || zTab==0 
68f0: 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  ) zTab = pTab->z
6900: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Name;.        sq
6910: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
6920: 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22  zName, zTab, "."
6930: 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , zCol, 0);.    
6940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6950: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
6960: 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49  zName, P3_DYNAMI
6970: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
6980: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6990: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
69a0: 2c 20 69 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65  , i, zCol, strle
69b0: 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  n(zCol));.      
69c0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
69d0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
69e0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
69f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
6a00: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70  tColName(v, i, p
6a10: 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61  ->span.z, p->spa
6a20: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  n.n);.      /* s
6a30: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65  qlite3VdbeCompre
6a40: 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29  ssSpace(v, addr)
6a50: 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ; */.    }else{.
6a60: 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65        char zName
6a70: 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  [30];.      asse
6a80: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  rt( p->op!=TK_CO
6a90: 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74  LUMN || pTabList
6aa0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72  ==0 );.      spr
6ab0: 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c  intf(zName, "col
6ac0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
6ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
6ae0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
6af0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  zName, 0);.    }
6b00: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
6b10: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
6b20: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
6b30: 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ist);.}..#ifndef
6b40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
6b50: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
6b60: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
6b70: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
6b80: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
6b90: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
6ba0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
6bb0: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
6bc0: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
6bd0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
6be0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
6bf0: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
6c00: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
6c10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
6c20: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
6c30: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
6c40: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6c50: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
6c60: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
6c70: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
6c80: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
6c90: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
6ca0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
6cb0: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
6cc0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6cd0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
6ce0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  */../*.** Forwar
6cf0: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
6d00: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
6d10: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
6d20: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a  *, Select*);../*
6d30: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
6d40: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
6d50: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
6d60: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
6d70: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
6d80: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
6d90: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
6da0: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
6db0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
6dc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
6dd0: 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65   *zTabName, Sele
6de0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6df0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69  Table *pTab;.  i
6e00: 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c  nt i, j;.  ExprL
6e10: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43  ist *pEList;.  C
6e20: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
6e30: 6f 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65 70 53  ol;..  if( prepS
6e40: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
6e50: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
6e60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6e70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
6e80: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
6e90: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
6ea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6eb0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
6ec0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
6ed0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
6ee0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
6ef0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6f00: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
6f10: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
6f20: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
6f30: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
6f40: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
6f50: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
6f60: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
6f70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
6f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
6f90: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
6fa0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
6fb0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
6fc0: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
6fd0: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
6fe0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
6ff0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
7000: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
7010: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
7020: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
7030: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
7040: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68  r *zName;.    ch
7050: 61 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20  ar *zBasename;. 
7060: 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20     int cnt;.    
7070: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7080: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74  .    .    /* Get
7090: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
70a0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
70b0: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
70c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
70d0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
70e0: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
70f0: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  || p->pRight->to
7100: 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70  ken.z==0 || p->p
7110: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  Right->token.z[0
7120: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
7130: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
7140: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
7150: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
7160: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
7170: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
7180: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
7190: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
71a0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
71b0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
71c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
71d0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44   if( p->op==TK_D
71e0: 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT .            
71f0: 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67    && (pR=p->pRig
7200: 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f  ht)!=0 && pR->to
7210: 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b  ken.z && pR->tok
7220: 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  en.z[0] ){.     
7230: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
7240: 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20  of the from A.B 
7250: 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d  use B as the nam
7260: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
7270: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
7280: 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b  f("%T", &pR->tok
7290: 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  en);.    }else i
72a0: 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  f( p->span.z && 
72b0: 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a  p->span.z[0] ){.
72c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
72d0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
72e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
72f0: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
7300: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
7310: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
7320: 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70  ntf("%T", &p->sp
7330: 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  an);.    }else{.
7340: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
7350: 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65  else fails, make
7360: 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20   up a name */.  
7370: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
7380: 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75  te3MPrintf("colu
7390: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
73a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
73b0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
73c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
73d0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
73e0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
73f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
7400: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
7410: 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  (0, pTab);.     
7420: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
7430: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
7440: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
7450: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
7460: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
7470: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
7480: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
7490: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
74a0: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
74b0: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
74c0: 20 20 20 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20      zBasename = 
74d0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a  zName;.    for(j
74e0: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
74f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
7500: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
7510: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
7520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7530: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
7540: 50 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20  Printf("%s:%d", 
7550: 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74  zBasename, ++cnt
7560: 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  );.        j = -
7570: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
7580: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
7590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
75a0: 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61 6d 65     if( zBasename
75b0: 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  !=zName ){.     
75c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 61 73   sqliteFree(zBas
75d0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
75e0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
75f0: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
7600: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
7610: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
7620: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
7630: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
7640: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
7650: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
7660: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
7670: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
7680: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
7690: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79  t->pSrc;.    zTy
76a0: 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  pe = sqliteStrDu
76b0: 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  p(columnType(&sN
76c0: 43 2c 20 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c  C, p));.    pCol
76d0: 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b  ->zType = zType;
76e0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
76f0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
7700: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
7710: 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20    pCol->pColl = 
7720: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7730: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
7740: 20 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e 70 43     if( !pCol->pC
7750: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
7760: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73  l->pColl = pPars
7770: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
7780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
7790: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
77a0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
77c0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
77d0: 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
77e0: 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66  g by doing the f
77f0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e  ollowing.** thin
7800: 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  gs:.**.**    (1)
7810: 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
7820: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
7830: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
7840: 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
7850: 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
7860: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
7870: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
7880: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
7890: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
78a0: 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
78b0: 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
78c0: 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
78d0: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
78e0: 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
78f0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
7900: 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
7910: 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
7920: 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
7930: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
7940: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
7950: 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
7960: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
7970: 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
7980: 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
7990: 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
79a0: 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
79b0: 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
79c0: 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
79d0: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
79e0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
79f0: 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
7a00: 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
7a10: 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
7a20: 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
7a30: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
7a40: 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
7a50: 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
7a60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
7a70: 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
7a80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
7a90: 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
7aa0: 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
7ab0: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
7ac0: 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
7ad0: 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
7ae0: 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
7af0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
7b00: 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
7b10: 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
7b20: 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
7b30: 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
7b40: 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
7b50: 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
7b60: 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
7b70: 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
7b80: 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
7b90: 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
7ba0: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
7bb0: 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
7bc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
7bd0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65   TABLE..**.** Re
7be0: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
7bf0: 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  s.  If there are
7c00: 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65   problems, leave
7c10: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
7c20: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
7c30: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
7c40: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
7c50: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
7c60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7c70: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
7c80: 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20  t i, j, k, rc;. 
7c90: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
7ca0: 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
7cb0: 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20  pEList;.  Table 
7cc0: 2a 70 54 61 62 3b 0a 20 20 73 74 72 75 63 74 20  *pTab;.  struct 
7cd0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
7ce0: 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  rom;..  if( p==0
7cf0: 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c   || p->pSrc==0 |
7d00: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
7d10: 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  _failed ) return
7d20: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
7d30: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
7d40: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
7d50: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
7d60: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
7d70: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
7d80: 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
7d90: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
7da0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
7db0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7dc0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
7dd0: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
7de0: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
7df0: 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pSrc);..  /* Loo
7e00: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
7e10: 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
7e20: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
7e30: 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
7e40: 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
7e50: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
7e60: 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
7e70: 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
7e80: 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
7e90: 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
7ea0: 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
7eb0: 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
7ec0: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
7ed0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
7ee0: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
7ef0: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
7f00: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
7f10: 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
7f20: 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
7f30: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65     /* This state
7f40: 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79  ment has already
7f50: 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20   been prepared. 
7f60: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
7f70: 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f  d.      ** to go
7f80: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
7f90: 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
7fa0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7fb0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7fc0: 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
7fd0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
7fe0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7ff0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
8000: 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
8010: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
8020: 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
8030: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
8040: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
8050: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
8060: 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  as==0 ){.       
8070: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pFrom->zAlias =
8080: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8090: 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c 69 74  e3MPrintf("sqlit
80a0: 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
80b0: 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70   (void*)pFrom->p
80c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
80d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
80e0: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
80f0: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
8100: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
8110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75       sqlite3Resu
8120: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
8130: 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c  arse, pFrom->zAl
8140: 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ias, pFrom->pSel
8150: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
8160: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
8170: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8180: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68     }.      /* Th
8190: 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c  e isTransient fl
81a0: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
81b0: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
81c0: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
81d0: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
81e0: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
81f0: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
8200: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
8210: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
8220: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
8230: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
8240: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
8250: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8260: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
8270: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
8280: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
8290: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
82a0: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
82b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
82c0: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
82d0: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
82e0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
82f0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
8300: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
8310: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
8320: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
8330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8340: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
8350: 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  se,pFrom->zName,
8360: 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
8370: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
8380: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
8390: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
83a0: 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
83b0: 65 66 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  ef++;.#ifndef SQ
83c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
83d0: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
83e0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
83f0: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
8400: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
8410: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
8420: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
8430: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
8440: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
8450: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
8460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
8470: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
8480: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
8490: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
84a0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
84b0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
84c0: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
84d0: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
84e0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
84f0: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
8500: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
8510: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
8520: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
8530: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
8540: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
8550: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
8560: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
8570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
8580: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
8590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
85a0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
85b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
85c0: 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  p(pTab->pSelect)
85d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
85e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
85f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
8600: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
8610: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
8620: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
8630: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
8640: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
8650: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
8660: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
8670: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
8680: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
8690: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
86a0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
86b0: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
86c0: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
86d0: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
86e0: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
86f0: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
8700: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
8710: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
8720: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
8730: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
8740: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
8750: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
8760: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
8770: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
8780: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
8790: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
87a0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
87b0: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
87c0: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
87d0: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
87e0: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
87f0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
8800: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
8810: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
8820: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
8830: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
8840: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
8850: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
8860: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
8870: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
8880: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
8890: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
88a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
88b0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
88c0: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
88d0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
88e0: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
88f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
8900: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
8910: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
8920: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
8930: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
8940: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
8950: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
8960: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
8970: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
8980: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
8990: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
89a0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
89b0: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
89c0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
89d0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
89e0: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
89f0: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
8a00: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
8a10: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
8a20: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
8a30: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
8a40: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
8a50: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
8a60: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
8a70: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
8a80: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
8a90: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
8aa0: 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
8ab0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
8ac0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
8ad0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
8ae0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26  lColNames)!=0 &&
8af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b00: 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
8b10: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
8b20: 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
8b30: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
8b40: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
8b50: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
8b60: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
8b70: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
8b80: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
8b90: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
8ba0: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
8bb0: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
8bc0: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
8bd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
8be0: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
8bf0: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
8c00: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
8c10: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
8c20: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
8c30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
8c40: 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d  ppend(pNew, a[k]
8c50: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
8c60: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
8c70: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
8c80: 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
8c90: 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
8ca0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  r = 0;.        a
8cb0: 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
8cc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8cd0: 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
8ce0: 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
8cf0: 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
8d00: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
8d10: 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
8d20: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
8d30: 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
8d40: 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
8d50: 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
8d60: 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
8d70: 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20   char *zTName;  
8d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78            /* tex
8d90: 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
8da0: 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
8db0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
8dc0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b   && pE->pLeft ){
8dd0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
8de0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
8df0: 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c  romToken(&pE->pL
8e00: 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
8e10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8e20: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
8e30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8e40: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
8e50: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
8e60: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
8e70: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
8e80: 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
8e90: 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
8ea0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
8eb0: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
8ec0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
8ed0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
8ee0: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
8ef0: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
8f10: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
8f20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
8f30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
8f40: 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d  Name && (zTabNam
8f50: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
8f60: 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20  [0]==0 || .     
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8f80: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
8f90: 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29  e, zTabName)!=0)
8fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8fb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8fc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8fd0: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
8fe0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
8ff0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
9000: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9010: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
9020: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
9030: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
9040: 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
9050: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a  aCol[j].zName;..
9060: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9070: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i>0 ){.         
9080: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
9090: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20  ist_item *pLeft 
90a0: 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
90b0: 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
90c0: 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a     if( (pLeft->j
90d0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
90e0: 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20  URAL)!=0 &&.    
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28      columnIndex(
9110: 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61  pLeft->pTab, zNa
9120: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
9130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
9140: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
9150: 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
9160: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  ** table on the 
9190: 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20  right */.       
91a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
91b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
91c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
91d0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
91e0: 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70  stIndex(pLeft->p
91f0: 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
9200: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9210: 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
9220: 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
9230: 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
9240: 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
9250: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
9260: 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
9270: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
9280: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
9290: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
92a0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
92b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
92c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
92d0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
92e0: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
92f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
9300: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20  if( pRight==0 ) 
9310: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
9320: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52 69     setToken(&pRi
9330: 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d  ght->token, zNam
9340: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
9350: 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20  if( zTabName && 
9360: 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54  (longNames || pT
9370: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
9380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9390: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
93a0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
93b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
93c0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
93d0: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
93e0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
93f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
9400: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
9410: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
9420: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
9430: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61  Left->token, zTa
9440: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
9450: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
9460: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c  pExpr->span, sql
9470: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e  ite3MPrintf("%s.
9480: 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
9490: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
94a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
94b0: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
94c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
94d0: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  token.z = 0;.   
94e0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
94f0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9510: 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  pr->token.dyn = 
9520: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
9530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9540: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
9550: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
9560: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
9570: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
9580: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9590: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
95a0: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
95b0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
95c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
95d0: 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c  end(pNew, pExpr,
95e0: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
9600: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
9610: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
9620: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
9630: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67  ew, pExpr, &pRig
9640: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
9650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
9670: 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
9680: 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
9690: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
96a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
96b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
96c0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
96d0: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
96e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
96f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9700: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9710: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
9720: 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
9730: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9740: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
9750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9760: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61   sqliteFree(zTNa
9770: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
9780: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
9790: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
97a0: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
97b0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
97c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
97d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
97e0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
97f0: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
9800: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
9810: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
9820: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
9830: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
9840: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
9850: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
9860: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
9870: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
9880: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
9890: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
98a0: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
98b0: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
98c0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
98d0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
98e0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
98f0: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
9900: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
9910: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
9920: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
9930: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
9940: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
9950: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
9960: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
9970: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
9980: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
9990: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
99a0: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
99b0: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
99c0: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
99d0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
99e0: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
99f0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
9a00: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
9a10: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
9a20: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
9a30: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9a40: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
9a50: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
9a60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
9a80: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
9a90: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
9aa0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
9ab0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
9ac0: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
9ad0: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
9ae0: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
9af0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
9b00: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
9b10: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
9b20: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
9b30: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b50: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
9b60: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
9b70: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
9b80: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
9b90: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
9ba0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
9bb0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
9bc0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
9bd0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9be0: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
9bf0: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
9c00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
9c10: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
9c20: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
9c30: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
9c40: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
9c50: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
9c60: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
9c70: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
9c80: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
9c90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
9ca0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
9cb0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
9cc0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
9cd0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
9ce0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
9cf0: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
9d00: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
9d10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9d20: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
9d30: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
9d40: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
9d50: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
9d60: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
9d70: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
9d80: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9d90: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
9da0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
9db0: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
9dc0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
9dd0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
9de0: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
9df0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
9e00: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
9e10: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
9e20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9e30: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
9e40: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
9e50: 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f   position %d sho
9e60: 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31  uld be between 1
9e70: 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20   and %d",.      
9e80: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
9e90: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
9ea0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
9eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
9ec0: 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74  .      if( !must
9ed0: 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69  Complete ) conti
9ee0: 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d  nue;.      iCol-
9ef0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  -;.    }.    for
9f00: 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20  (j=0; iCol<0 && 
9f10: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
9f20: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9f30: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
9f40: 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d  ame && (pE->op==
9f50: 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d  TK_ID || pE->op=
9f60: 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20  =TK_STRING) ){. 
9f70: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
9f80: 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20  me, *zLabel;.   
9f90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
9fa0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
9fb0: 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20  .        zLabel 
9fc0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9fd0: 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65  mToken(&pE->toke
9fe0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
9ff0: 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b  rt( zLabel!=0 );
a000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
a010: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
a020: 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b  e, zLabel)==0 ){
a030: 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c   .          iCol
a040: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
a050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
a060: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ee(zLabel);.    
a070: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
a080: 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45  ol<0 && sqlite3E
a090: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
a0a0: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
a0b0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  r) ){.        iC
a0c0: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  ol = j;.      }.
a0d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
a0e0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
a0f0: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  E->op = TK_COLUM
a100: 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f  N;.      pE->iCo
a110: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
a120: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
a130: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
a140: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
a150: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
a160: 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ].done = 1;.    
a170: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  }.    if( iCol<0
a180: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
a190: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a1a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a1b0: 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ,.        "ORDER
a1c0: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
a1d0: 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  %d does not matc
a1e0: 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  h any result col
a1f0: 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  umn", i+1);.    
a200: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
a210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
a220: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
a230: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69   .}.#endif /* #i
a240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a250: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
a260: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  T */../*.** Get 
a270: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
a280: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
a290: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
a2a0: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
a2b0: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
a2c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
a2d0: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
a2e0: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
a2f0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
a300: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
a310: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
a320: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a330: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
a340: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
a350: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
a360: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
a370: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
a380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
a390: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
a3a0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
a3b0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
a3c0: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
a3d0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
a3e0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
a3f0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 6e 4c 69  xpressions.  nLi
a400: 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74 20  mit and nOffset 
a410: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
a420: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
a430: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
a440: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
a450: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
a460: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
a470: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
a480: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
a490: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
a4a0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
a4b0: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
a4c0: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
a4d0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
a4e0: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
a4f0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
a500: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
a510: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
a520: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
a530: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
a540: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
a550: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
a560: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
a570: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
a580: 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66 20  s the values if 
a590: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
a5a0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
a5b0: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
a5c0: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 6e 4c  is defined by nL
a5d0: 69 6d 69 74 20 61 6e 64 20 6e 4f 66 66 73 65 74  imit and nOffset
a5e0: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
a5f0: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
a600: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
a610: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
a620: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
a630: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
a640: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
a650: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
a660: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
a670: 4f 6e 6c 79 20 69 66 20 6e 4c 69 6d 69 74 3e 3d  Only if nLimit>=
a680: 30 20 6f 72 20 6e 4f 66 66 73 65 74 3e 30 20 64  0 or nOffset>0 d
a690: 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  o the limit regi
a6a0: 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64  sters get.** red
a6b0: 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49  efined.  The UNI
a6c0: 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
a6d0: 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72  uses this proper
a6e0: 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74  ty to force.** t
a6f0: 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20  he reuse of the 
a700: 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f  same limit and o
a710: 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20  ffset registers 
a720: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a  across multiple.
a730: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
a740: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
a750: 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69  void computeLimi
a760: 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65  tRegisters(Parse
a770: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
a780: 20 2a 70 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a   *p){.  /* .  **
a790: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
a7a0: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
a7b0: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
a7c0: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
a7d0: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
a7e0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
a7f0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
a800: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
a810: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
a820: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
a830: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
a840: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
a850: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
a860: 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
a870: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
a880: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
a890: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
a8a0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
a8b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
a8c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a8d0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
a8e0: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
a8f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a900: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
a910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a920: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
a930: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
a940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a950: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
a960: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
a970: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a980: 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65   "# LIMIT counte
a990: 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69  r"));.    p->iLi
a9a0: 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a  mit = iMem;.  }.
a9b0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
a9c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d   ){.    int iMem
a9d0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a9e0: 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  +;.    Vdbe *v =
a9f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
aa00: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
aa10: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
aa20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
aa30: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
aa40: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
aa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aa60: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30   OP_MustBeInt, 0
aa70: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
aa80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa90: 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c 20 30 29  _Negative, 0, 0)
aaa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
aac0: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 31 29 3b  Store, iMem, 1);
aad0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
aae0: 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63  ((v, "# OFFSET c
aaf0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 70  ounter"));.    p
ab00: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4d 65 6d  ->iOffset = iMem
ab10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
ab20: 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75 61  llocate a virtua
ab30: 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
ab40: 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73  or sorting..*/.s
ab50: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
ab60: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61  eSortingIndex(Pa
ab70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
ab80: 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ect *p, ExprList
ab90: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69   *pOrderBy){.  i
aba0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
abb0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
abc0: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
abd0: 79 2d 3e 69 54 61 62 3d 3d 30 20 29 3b 0a 20 20  y->iTab==0 );.  
abe0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61 62    pOrderBy->iTab
abf0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
ac00: 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  +;.    addr = sq
ac10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
ac20: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
ac30: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 0a 20 20  _OpenVirtual,.  
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
ac60: 42 79 2d 3e 69 54 61 62 2c 20 70 4f 72 64 65 72  By->iTab, pOrder
ac70: 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20  By->nExpr+1);.  
ac80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ac90: 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 3d 20  rOpenVirt[2] == 
aca0: 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64  -1 );.    p->add
acb0: 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61  rOpenVirt[2] = a
acc0: 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ddr;.  }.}../*.*
acd0: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 61 74 20  * The opcode at 
ace0: 61 64 64 72 20 69 73 20 61 6e 20 4f 50 5f 4f 70  addr is an OP_Op
acf0: 65 6e 56 69 72 74 75 61 6c 20 74 68 61 74 20 63  enVirtual that c
ad00: 72 65 61 74 65 64 20 61 20 73 6f 72 74 69 6e 67  reated a sorting
ad10: 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 20 77 65  .** index tha we
ad20: 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 6e 65   ended up not ne
ad30: 65 64 69 6e 67 2e 20 20 54 68 69 73 20 72 6f 75  eding.  This rou
ad40: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 61  tine changes tha
ad50: 74 0a 2a 2a 20 6f 70 63 6f 64 65 20 74 6f 20 4f  t.** opcode to O
ad60: 50 5f 4e 6f 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69  P_Noop..*/.stati
ad70: 63 20 76 6f 69 64 20 75 6e 63 72 65 61 74 65 53  c void uncreateS
ad80: 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73  ortingIndex(Pars
ad90: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 61  e *pParse, int a
ada0: 64 64 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ddr){.  Vdbe *v 
adb0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
adc0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  .  VdbeOp *pOp =
add0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
ade0: 70 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  p(v, addr);.  sq
adf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ae00: 33 28 76 2c 20 61 64 64 72 2c 20 30 2c 20 30 29  3(v, addr, 0, 0)
ae10: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
ae20: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 70 4f 70  = OP_Noop;.  pOp
ae30: 2d 3e 70 31 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p1 = 0;.  pOp-
ae40: 3e 70 32 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e  >p2 = 0;.}..#ifn
ae50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ae60: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ae70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ae80: 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
ae90: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
aea0: 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
aeb0: 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
aec0: 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
aed0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
aee0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
aef0: 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
af00: 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
af10: 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
af20: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
af30: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
af40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
af50: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
af60: 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
af70: 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
af80: 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
af90: 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
afa0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
afb0: 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
afc0: 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
afd0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
afe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
aff0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
b000: 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
b010: 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
b020: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
b030: 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
b040: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b050: 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
b060: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
b070: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  et = 0;.  }.  if
b080: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
b090: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
b0a0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
b0b0: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
b0c0: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
b0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
b0e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b0f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b100: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
b110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b120: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b130: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
b140: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
b150: 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79   process a query
b160: 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20   that is really 
b170: 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20  the union.** or 
b180: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
b190: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
b1a0: 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a  rate queries..**
b1b0: 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
b1c0: 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
b1d0: 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
b1e0: 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
b1f0: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
b200: 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
b210: 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
b220: 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
b230: 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
b240: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
b250: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
b260: 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
b270: 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
b280: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
b290: 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
b2a0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
b2b0: 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
b2c0: 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
b2d0: 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
b2e0: 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
b2f0: 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
b300: 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
b310: 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
b320: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
b330: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
b340: 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
b350: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
b360: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
b370: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
b380: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
b390: 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
b3a0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
b3b0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
b3c0: 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
b3d0: 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
b3e0: 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
b3f0: 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
b400: 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
b410: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
b420: 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
b430: 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
b440: 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
b450: 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
b460: 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
b470: 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
b480: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b490: 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
b4a0: 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
b4b0: 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
b4c0: 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
b4d0: 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
b4e0: 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
b4f0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
b500: 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
b510: 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
b520: 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
b530: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
b540: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
b550: 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
b560: 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
b570: 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
b580: 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
b590: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
b5a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
b5b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
b5c0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
b5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b5e0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
b5f0: 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
b600: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ded */.  int eDe
b610: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  st,            /
b620: 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75  * \___  Store qu
b630: 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73  ery results as s
b640: 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e  pecified */.  in
b650: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
b660: 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20      /* /     by 
b670: 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65  these two parame
b680: 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f  ters.         */
b690: 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
b6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
b6b0: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
b6c0: 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
b6d0: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
b6e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b6f0: 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
b700: 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
b710: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
b720: 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
b730: 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
b740: 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
b750: 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
b760: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
b770: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
b780: 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
b790: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
b7a0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
b7b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
b7c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
b7d0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
b7e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
b7f0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
b800: 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f  Y clause on p */
b810: 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d  .  int aSetP2[2]
b820: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
b830: 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73  P2 value of thes
b840: 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f  e op to number o
b850: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  f columns */.  i
b860: 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20  nt nSetP2 = 0;  
b870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b880: 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50  f slots in aSetP
b890: 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  2[] used */..  /
b8a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
b8b0: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
b8c0: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
b8d0: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
b8e0: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
b8f0: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
b900: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
b910: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
b920: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
b930: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69   LIMIT..  */.  i
b940: 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50  f( p==0 || p->pP
b950: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rior==0 ){.    r
b960: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
b970: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
b980: 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d  ;.  }.  pPrior =
b990: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
b9a0: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
b9b0: 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72  ightmost!=pPrior
b9c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b9d0: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
b9e0: 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ==p->pRightmost 
b9f0: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
ba00: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
ba10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ba20: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
ba30: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
ba40: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
ba50: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
ba60: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
ba70: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
ba80: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
ba90: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
baa0: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
bab0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
bac0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bad0: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
bae0: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
baf0: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
bb00: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
bb10: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
bb20: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
bb30: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
bb40: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
bb50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
bb60: 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72  ave a valid quer
bb70: 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f  y engine.  If no
bb80: 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  t, create a new 
bb90: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  one..  */.  v = 
bba0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
bbb0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
bbc0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  =0 ){.    rc = 1
bbd0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
bbe0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bbf0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
bc00: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
bc10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
bc20: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
bc30: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
bc40: 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
bc50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
bc60: 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ist );.    asser
bc70: 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
bc80: 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
bc90: 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
bca0: 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b    aSetP2[nSetP2+
bcb0: 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  +] = sqlite3Vdbe
bcc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
bcd0: 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20  Virtual, iParm, 
bce0: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
bcf0: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
bd00: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
bd10: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
bd20: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
bd30: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
bd40: 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  /.  pOrderBy = p
bd50: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77  ->pOrderBy;.  sw
bd60: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
bd70: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
bd80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
bd90: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
bda0: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
bdb0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
bdc0: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
bdd0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
bde0: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
bdf0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
be00: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
be10: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
be20: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
be30: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  r, eDest, iParm,
be40: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
be50: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
be60: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
be70: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
be80: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
be90: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
bea0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   0;.        p->i
beb0: 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e  Limit = pPrior->
bec0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  iLimit;.        
bed0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
bee0: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
bef0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
bf00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
bf10: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
bf20: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bf30: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
bf40: 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  p, eDest, iParm,
bf50: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
bf60: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
bf70: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
bf80: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
bf90: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
bfa0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
bfb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bfc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
bfd0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49        /* For UNI
bfe0: 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52  ON ALL ... ORDER
bff0: 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   BY fall through
c000: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73   to the next cas
c010: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
c020: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
c030: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
c040: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
c050: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
c060: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
c070: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c080: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
c090: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
c0a0: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  p = 0;      /* O
c0b0: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
c0c0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
c0d0: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
c0e0: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
c0f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
c100: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
c110: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
c120: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
c130: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
c140: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
c150: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
c160: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
c170: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
c180: 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f  ddr;..      prio
c190: 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  rOp = p->op==TK_
c1a0: 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20  ALL ? SRT_Table 
c1b0: 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  : SRT_Union;.   
c1c0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72     if( eDest==pr
c1d0: 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42  iorOp && pOrderB
c1e0: 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d  y==0 && !p->pLim
c1f0: 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65  it && !p->pOffse
c200: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
c210: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
c220: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
c230: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
c240: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
c250: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
c260: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c270: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72   unionTab = iPar
c280: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
c290: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
c2a0: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
c2b0: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
c2c0: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
c2d0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
c2e0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
c2f0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
c300: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
c310: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
c320: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b++;.        if(
c330: 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74   pOrderBy && mat
c340: 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d  chOrderbyToColum
c350: 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72  n(pParse, p, pOr
c360: 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c  derBy, unionTab,
c370: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
c380: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
c390: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c3a0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c3b0: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 20   }.        addr 
c3c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c3d0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
c3e0: 74 75 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  tual, unionTab, 
c3f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
c400: 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62  priorOp==SRT_Tab
c410: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
c420: 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73  assert( nSetP2<s
c430: 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69  izeof(aSetP2)/si
c440: 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20  zeof(aSetP2[0]) 
c450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53 65  );.          aSe
c460: 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20  tP2[nSetP2++] = 
c470: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  addr;.        }e
c480: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
c490: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
c4a0: 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20  enVirt[0] == -1 
c4b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
c4c0: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
c4d0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
c4e0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
c4f0: 3e 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a 20  >usesVirt = 1;. 
c500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c510: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
c520: 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
c530: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
c540: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c550: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
c560: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
c570: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c580: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
c590: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
c5a0: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
c5b0: 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
c5c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c5d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
c5e0: 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  ior, priorOp, un
c5f0: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
c600: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
c610: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c620: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c630: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
c640: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
c650: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
c660: 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
c670: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
c680: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20   p->op ){.      
c690: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
c6a0: 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63  T:  op = SRT_Exc
c6b0: 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ept;   break;.  
c6c0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55         case TK_U
c6d0: 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54  NION:   op = SRT
c6e0: 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b  _Union;    break
c6f0: 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20  ;.         case 
c700: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d  TK_ALL:     op =
c710: 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62   SRT_Table;    b
c720: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c730: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c740: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  0;.      p->pOrd
c750: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
c760: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
c770: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
c780: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
c790: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
c7a0: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
c7b0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
c7c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c7d0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f  ect(pParse, p, o
c7e0: 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20  p, unionTab, 0, 
c7f0: 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20  0, 0, aff);.    
c800: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
c810: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
c820: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
c830: 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  By;.      sqlite
c840: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
c850: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
c860: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
c870: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
c880: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
c890: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
c8a0: 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  -1;.      p->iOf
c8b0: 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  fset = -1;.     
c8c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c8d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c8e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c8f0: 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  }...      /* Con
c900: 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
c910: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
c920: 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
c930: 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
c940: 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
c950: 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
c960: 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20       */      .  
c970: 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d 70      if( eDest!=p
c980: 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54  riorOp || unionT
c990: 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20  ab!=iParm ){.   
c9a0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
c9b0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
c9c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c9d0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
c9e0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
c9f0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a  SRT_Callback ){.
ca00: 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72 61            genera
ca10: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
ca20: 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69  arse, 0, p->pELi
ca30: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
ca40: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
ca50: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ca60: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
ca70: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
ca80: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ca90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
caa0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cab0: 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
cac0: 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
cad0: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
cae0: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
caf0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53  , p);.        iS
cb00: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
cb10: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
cb20: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
cb30: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
cb40: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
cb50: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
cb60: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
cb70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
cb90: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
cba0: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
cbd0: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
cbe0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
cbf0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
cc00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75           goto mu
cc10: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cc20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cc30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cc40: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
cc50: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
cc60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
cc70: 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
cc80: 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  ab, iStart);.   
cc90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cca0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ccb0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
ccc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ccd0: 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  p(v, OP_Close, u
cce0: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
ccf0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
cd00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cd10: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
cd20: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
cd30: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
cd40: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
cd50: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
cd60: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
cd70: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
cd80: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  addr;..      /* 
cd90: 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
cda0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
cdb0: 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
cdc0: 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
cdd0: 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
cde0: 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
cdf0: 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
ce00: 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
ce10: 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
ce20: 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
ce30: 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
ce40: 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
ce50: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
ce60: 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
ce70: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
ce80: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
ce90: 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79   && matchOrderby
cea0: 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ToColumn(pParse,
ceb0: 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  p,pOrderBy,tab1,
cec0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
ced0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
cee0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cef0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
cf00: 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67     createSorting
cf10: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c  Index(pParse, p,
cf20: 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20   pOrderBy);..   
cf30: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
cf40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cf50: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61  _OpenVirtual, ta
cf60: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
cf70: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
cf80: 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29  nVirt[0] == -1 )
cf90: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
cfa0: 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64  penVirt[0] = add
cfb0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
cfc0: 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74  htmost->usesVirt
cfd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
cfe0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
cff0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d000: 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
d010: 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
d020: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d030: 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
d040: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d050: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d060: 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e  Prior, SRT_Union
d070: 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c  , tab1, 0, 0, 0,
d080: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
d090: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d0a0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d0b0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d0c0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d0d0: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
d0e0: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d0f0: 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
d100: 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
d110: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d120: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
d130: 74 75 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  tual, tab2, 0);.
d140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d150: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d  >addrOpenVirt[1]
d160: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
d170: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
d180: 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
d190: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
d1a0: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
d1b0: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d1c0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d1d0: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
d1e0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
d1f0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d200: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d210: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d220: 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  , p, SRT_Union, 
d230: 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab2, 0, 0, 0, a
d240: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
d250: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
d260: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d270: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
d280: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
d290: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
d2a0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
d2b0: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
d2c0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d2d0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d2e0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
d2f0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
d300: 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20  te code to take 
d310: 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  the intersection
d320: 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70   of the two temp
d330: 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74  orary.      ** t
d340: 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  ables..      */.
d350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d360: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
d370: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
d380: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
d390: 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
d3a0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
d3b0: 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  0, p->pEList);. 
d3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
d3d0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
d3e0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d3f0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
d400: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d410: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
d420: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d430: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
d440: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d450: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
d460: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 29  sters(pParse, p)
d470: 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
d480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d490: 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  p(v, OP_RowKey, 
d4a0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
d4b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d4c0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
d4d0: 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20   tab2, iCont);. 
d4e0: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
d4f0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
d500: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
d510: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
d520: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d       pOrderBy, -
d550: 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  1, eDest, iParm,
d560: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d580: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29  Cont, iBreak, 0)
d590: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d5a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
d5b0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
d5c0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
d5e0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d5f0: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
d600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d610: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
d620: 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
d630: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d640: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d650: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
d660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d670: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
d680: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
d690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d6a0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d6b0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
d6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
d6d0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
d6e0: 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
d6f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
d700: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
d710: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
d720: 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
d730: 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
d740: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d750: 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
d760: 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
d770: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
d780: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
d790: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
d7a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d7b0: 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f  rse, "SELECTs to
d7c0: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d7d0: 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20  ght of %s".     
d7e0: 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
d7f0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
d800: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
d810: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
d820: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
d830: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d840: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d850: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
d860: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
d870: 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  mns in temporary
d880: 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e   tables.  */.  n
d890: 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
d8a0: 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28  >nExpr;.  while(
d8b0: 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73   nSetP2 ){.    s
d8c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d8d0: 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e  P2(v, aSetP2[--n
d8e0: 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20  SetP2], nCol);. 
d8f0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
d900: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
d910: 6e 63 65 73 20 75 73 65 64 20 62 79 20 65 69 74  nces used by eit
d920: 68 65 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  her the ORDER BY
d930: 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20   clause or.  ** 
d940: 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79  by any temporary
d950: 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
d960: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
d970: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
d980: 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
d990: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
d9a0: 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
d9b0: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76  ary tables.  Inv
d9c0: 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44  oke the.  ** ORD
d9d0: 45 52 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67  ER BY processing
d9e0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
d9f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
da00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
da10: 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
da20: 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
da30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
da40: 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
da50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
da60: 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
da70: 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
da80: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
da90: 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
daa0: 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
dab0: 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
dac0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
dad0: 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
dae0: 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
daf0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
db00: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c    if( pOrderBy |
db10: 7c 20 70 2d 3e 75 73 65 73 56 69 72 74 20 29 7b  | p->usesVirt ){
db20: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
db50: 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
db60: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
db70: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
db80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
db90: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
dba0: 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
dbb0: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
dbc0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
dbd0: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
dbe0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
dbf0: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
dc00: 61 70 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c  apColl;.    Coll
dc10: 53 65 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20  Seq **aCopy;..  
dc20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
dc30: 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
dc40: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
dc50: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
dc60: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
dc70: 2a 32 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  *2*sizeof(CollSe
dc80: 71 2a 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20 20 20  q*) + nCol);.   
dc90: 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
dca0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
dcb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
dcc0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
dcd0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
dce0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63     pKeyInfo->enc
dcf0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
dd00: 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  nc;.    pKeyInfo
dd10: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b  ->nField = nCol;
dd20: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  ..    for(i=0, a
dd30: 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
dd40: 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
dd50: 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
dd60: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
dd70: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
dd80: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
dd90: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
dda0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
ddb0: 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   *apColl = pPars
ddc0: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
ddd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dde0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
ddf0: 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
de00: 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
de10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
de20: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
de30: 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
de40: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
de50: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
de60: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
de70: 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
de80: 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
de90: 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
dea0: 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
deb0: 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
dec0: 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
ded0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
dee0: 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
def0: 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
df00: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
df10: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
df20: 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
df30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
df40: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
df50: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
df60: 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
df70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
df80: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
df90: 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49  dr, (char*)pKeyI
dfa0: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
dfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfc0: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
dfd0: 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  y ){.      struc
dfe0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
dff0: 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72  *pOTerm = pOrder
e000: 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74  By->a;.      int
e010: 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42   nExpr = pOrderB
e020: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
e030: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
e040: 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *pSortOrder;.
e050: 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 28  .      aCopy = (
e060: 43 6f 6c 6c 53 65 71 2a 2a 29 26 70 4b 65 79 49  CollSeq**)&pKeyI
e070: 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53  nfo[1];.      pS
e080: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49  ortOrder = pKeyI
e090: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
e0a0: 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 45  = (u8*)&aCopy[nE
e0b0: 78 70 72 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  xpr];.      memc
e0c0: 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e  py(aCopy, pKeyIn
e0d0: 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a  fo->aColl, nCol*
e0e0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
e0f0: 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20  );.      apColl 
e100: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
e110: 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  l;.      for(i=0
e120: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
e130: 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d  xpr; i++, pOTerm
e140: 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53  ++, apColl++, pS
e150: 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20  ortOrder++){.   
e160: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
e170: 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72   = pOTerm->pExpr
e180: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
e190: 7a 4e 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e  zName = pOTerm->
e1a0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61  zName;.        a
e1b0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e1c0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
e1d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43  Expr->iColumn<nC
e1e0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ol );.        if
e1f0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
e200: 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73       *apColl = s
e210: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
e220: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  Seq(pParse, zNam
e230: 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  e, -1);.        
e240: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e250: 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79   *apColl = aCopy
e260: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
e270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e280: 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20      *pSortOrder 
e290: 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72  = pOTerm->sortOr
e2a0: 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  der;.      }.   
e2b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
e2c0: 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
e2d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e2e0: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e  addrOpenVirt[2]>
e2f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72  =0 );.      addr
e300: 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69   = p->addrOpenVi
e310: 72 74 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c  rt[2];.      sql
e320: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
e330: 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c  (v, addr, p->pEL
e340: 69 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  ist->nExpr+2);. 
e350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e360: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
e370: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
e380: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
e390: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b  NDOFF);.      pK
e3a0: 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  eyInfo = 0;.    
e3b0: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
e3c0: 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
e3d0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e3e0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
e3f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
e400: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
e410: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
e420: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75  lect_end:.  retu
e430: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e440: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e450: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e460: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e470: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
e480: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
e490: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
e4a0: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
e4b0: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
e4c0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
e4d0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
e4e0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
e4f0: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
e500: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
e510: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
e520: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
e530: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
e540: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
e550: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e560: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
e570: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
e580: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
e590: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
e5a0: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
e5b0: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
e5c0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
e5d0: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
e5e0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
e5f0: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
e600: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
e610: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
e620: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
e630: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
e640: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
e650: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
e660: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
e670: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
e680: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
e690: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
e6a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
e6b0: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
e6c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e6d0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
e6e0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e6f0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
e700: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
e710: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
e720: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
e730: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
e740: 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
e750: 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
e760: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
e770: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e780: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
e790: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
e7a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
e7b0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
e7c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e7d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e7e0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
e7f0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
e800: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
e810: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
e820: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
e830: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
e840: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
e850: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
e860: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
e870: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
e880: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
e890: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e8a0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
e8b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
e8c0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
e8d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
e8e0: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
e8f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
e900: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
e910: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
e920: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
e930: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
e940: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
e950: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
e960: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
e970: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
e980: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
e990: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
e9a0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
e9b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
e9c0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
e9d0: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
e9e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e9f0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
ea00: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
ea10: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
ea20: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
ea30: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
ea40: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
ea50: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
ea60: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
ea70: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
ea80: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
ea90: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
eaa0: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
eab0: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
eac0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
ead0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
eae0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
eaf0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
eb00: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
eb10: 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74    pExpr->pSelect
eb20: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
eb30: 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63  Dup(pNew->pSelec
eb40: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
eb50: 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
eb60: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
eb70: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
eb80: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
eb90: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
eba0: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
ebb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
ebc0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
ebd0: 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
ebe0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
ebf0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ec00: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
ec10: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
ec20: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ec30: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ec40: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
ec50: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
ec60: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
ec70: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
ec80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
ec90: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
eca0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
ecb0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
ecc0: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
ecd0: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
ece0: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
ecf0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
ed00: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
ed10: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
ed20: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
ed30: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
ed40: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
ed50: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
ed60: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  t(p->pEList, iTa
ed70: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
ed80: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
ed90: 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
eda0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
edb0: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
edc0: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
edd0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
ede0: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
edf0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ee00: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70  );.  substExpr(p
ee10: 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
ee20: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
ee30: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ee40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
ee50: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
ee60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
ee70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ee80: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
ee90: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
eea0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
eeb0: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
eec0: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
eed0: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
eee0: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
eef0: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
ef00: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
ef10: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
ef20: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
ef30: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
ef40: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
ef50: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
ef60: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
ef70: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
ef80: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
ef90: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
efa0: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
efb0: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
efc0: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
efd0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
efe0: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
eff0: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
f000: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
f010: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
f020: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
f030: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
f040: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
f050: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
f060: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
f070: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
f080: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
f090: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
f0a0: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
f0b0: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
f0c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
f0d0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f0e0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
f0f0: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
f100: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
f110: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
f120: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
f130: 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
f140: 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
f150: 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
f160: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
f170: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
f180: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
f190: 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
f1a0: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
f1b0: 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
f1c0: 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
f1d0: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
f1e0: 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
f1f0: 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
f200: 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
f210: 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
f220: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
f230: 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
f240: 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
f250: 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
f260: 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
f270: 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
f280: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
f290: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
f2a0: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
f2b0: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
f2c0: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
f2d0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
f2e0: 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
f2f0: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
f300: 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
f310: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
f320: 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
f330: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
f340: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
f350: 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
f360: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
f370: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
f380: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
f390: 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
f3a0: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
f3b0: 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
f3c0: 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
f3d0: 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
f3e0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f3f0: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
f400: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f410: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
f420: 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
f430: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
f440: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
f450: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
f460: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
f470: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
f480: 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
f490: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
f4a0: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
f4b0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f4c0: 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
f4d0: 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
f4e0: 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
f4f0: 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
f500: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
f510: 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
f520: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f530: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
f540: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
f550: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
f560: 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
f570: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
f580: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
f590: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
f5a0: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
f5b0: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
f5c0: 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
f5d0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
f5e0: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
f5f0: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f600: 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
f610: 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
f620: 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
f630: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
f640: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
f650: 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
f660: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
f670: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
f680: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
f690: 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
f6a0: 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
f6b0: 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
f6c0: 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
f6d0: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
f6e0: 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
f6f0: 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
f700: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
f710: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
f720: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
f730: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
f740: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
f750: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
f760: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
f770: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
f780: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
f790: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
f7a0: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
f7b0: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
f7c0: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
f7d0: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
f7e0: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
f7f0: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
f800: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
f810: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
f820: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
f830: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
f840: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
f850: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
f860: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
f870: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
f880: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
f890: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
f8a0: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
f8b0: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
f8c0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
f8d0: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
f8e0: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
f8f0: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
f900: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
f910: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
f920: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
f930: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
f940: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
f950: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
f960: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
f970: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
f980: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
f990: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
f9a0: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
f9b0: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
f9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
f9d0: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
f9e0: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
f9f0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
fa00: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
fa10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
fa20: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
fa30: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
fa40: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
fa50: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
fa60: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
fa70: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
fa80: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
fa90: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
faa0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
fab0: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
fac0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
fad0: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
fae0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
faf0: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
fb00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
fb10: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
fb20: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
fb30: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
fb40: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
fb50: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
fb60: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
fb70: 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
fb80: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
fb90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
fba0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
fbb0: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
fbc0: 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
fbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fbe0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
fbf0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
fc00: 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
fc10: 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
fc20: 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  uery */..  /* Ch
fc30: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
fc40: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
fc50: 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
fc60: 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
fc70: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
fc80: 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
fc90: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
fca0: 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
fcb0: 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
fcc0: 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
fcd0: 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
fce0: 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20  From];.  pSub = 
fcf0: 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
fd00: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
fd10: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
fd20: 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
fd30: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
fd40: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
fd50: 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
fd60: 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
fd70: 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
fd80: 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
fd90: 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
fda0: 69 66 28 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69  if( (pSub->pLimi
fdb0: 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 29 20  t && p->pLimit) 
fdc0: 7c 7c 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  || pSub->pOffset
fdd0: 20 7c 7c 20 0a 20 20 20 20 20 20 28 70 53 75 62   || .      (pSub
fde0: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 69 73 41 67  ->pLimit && isAg
fdf0: 67 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  g) ) return 0;. 
fe00: 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
fe10: 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
fe20: 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69 73  ;.  if( pSub->is
fe30: 44 69 73 74 69 6e 63 74 20 26 26 20 28 70 53 72  Distinct && (pSr
fe40: 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
fe50: 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
fe60: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
fe70: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  p->isDistinct &&
fe80: 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
fe90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fea0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
feb0: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
fec0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
fed0: 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
fee0: 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
fef0: 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
ff00: 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
ff10: 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
ff20: 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
ff30: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
ff40: 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
ff50: 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
ff60: 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
ff70: 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
ff80: 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
ff90: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
ffa0: 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
ffb0: 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
ffc0: 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
ffd0: 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
ffe0: 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
fff0: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
10000 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
10010 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
10020 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
10030 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
10040 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
10050 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
10060 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
10070 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
10080 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
10090 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
100a0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
100b0 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
100c0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
100d0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
100e0 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
100f0 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
10100 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
10110 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
10120 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
10130 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
10140 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
10150 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
10160 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
10170 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
10180 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
10190 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
101a0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
101b0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
101c0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
101d0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
101e0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
101f0 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
10200 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
10210 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
10220 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
10230 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
10240 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
10250 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
10260 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
10270 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
10280 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
10290 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
102a0 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
102b0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
102c0 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
102d0 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
102e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
102f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
10300 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
10310 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
10320 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
10330 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
10340 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
10350 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10360 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
10370 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
10380 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
10390 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
103a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
103b0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
103c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
103d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
103e0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
103f0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
10400 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
10410 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
10420 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
10430 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
10440 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
10450 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
10460 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
10470 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
10480 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
10490 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
104a0 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
104b0 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
104c0 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
104d0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
104e0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
104f0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
10500 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
10510 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
10520 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
10530 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
10540 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
10550 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
10560 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
10570 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
10580 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
10590 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
105a0 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20  ->jointype;..   
105b0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
105c0 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d  ble(0, pSubitem-
105d0 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
105e0 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
105f0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
10600 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
10610 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
10620 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
10630 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
10640 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
10650 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
10660 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
10670 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
10680 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
10690 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
106a0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
106b0 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c  tAppend(pSrc, 0,
106c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
106d0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
106e0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
106f0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
10700 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
10710 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
10720 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
10730 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
10740 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
10750 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
10760 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
10770 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
10780 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
10790 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
107a0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
107b0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
107c0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
107d0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53  pSrc->a[iFrom+nS
107e0 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ubSrc-1].jointyp
107f0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
10800 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
10810 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
10820 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
10830 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
10840 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
10850 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
10860 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
10870 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
10880 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
10890 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
108a0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
108b0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
108c0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
108d0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
108e0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
108f0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10900 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
10910 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
10920 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
10930 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10940 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
10950 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
10960 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10970 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
10980 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
10990 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
109a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
109b0 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
109c0 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
109d0 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
109e0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
109f0 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
10a00 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
10a10 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78  ..  */.  substEx
10a20 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
10a30 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10a40 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73  >pEList);.  pLis
10a50 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
10a60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
10a70 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10a80 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
10a90 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
10aa0 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
10ab0 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
10ac0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
10ad0 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
10ae0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
10af0 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
10b00 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  up(pExpr->span.z
10b10 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
10b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10b30 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
10b40 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
10b50 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
10b60 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10b70 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
10b80 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
10b90 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10ba0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
10bb0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
10bc0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10bd0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
10be0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10bf0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
10c00 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
10c10 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  By = 0;.  }else 
10c20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
10c30 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
10c40 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
10c50 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10c60 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
10c70 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
10c80 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
10c90 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10ca0 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
10cb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
10cc0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
10cd0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
10ce0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10cf0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
10d00 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
10d10 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
10d20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
10d30 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
10d40 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
10d50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
10d60 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  ist);.    p->pHa
10d70 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
10d80 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67  prAnd(p->pHaving
10d90 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
10da0 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29  (pSub->pHaving))
10db0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10dc0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
10dd0 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
10de0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
10df0 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75  tDup(pSub->pGrou
10e00 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
10e10 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
10e20 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
10e30 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
10e40 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
10e50 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
10e60 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
10e70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
10e80 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
10e90 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
10ea0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
10eb0 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
10ec0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
10ed0 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
10ee0 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
10ef0 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
10f00 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
10f10 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45  ..  /*.  ** SELE
10f20 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
10f30 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
10f40 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
10f50 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2f  x OFFSET y;.  */
10f60 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
10f70 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  mit ){.    p->pL
10f80 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
10f90 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  mit;.    pSub->p
10fa0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Limit = 0;.  }..
10fb0 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
10fc0 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
10fd0 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
10fe0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
10ff0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
11000 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11010 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
11020 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
11030 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11040 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
11050 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
11060 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
11070 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
11080 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
11090 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
110a0 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
110b0 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
110c0 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
110d0 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
110e0 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
110f0 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
11100 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
11110 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
11120 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
11130 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
11140 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74  s SELECT and ret
11150 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
11160 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
11170 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11180 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
11190 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
111a0 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
111b0 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
111c0 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
111d0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
111e0 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
111f0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
11200 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
11210 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
11220 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
11230 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
11240 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
11250 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
11260 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
11270 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
11280 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
11290 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
112a0 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
112b0 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
112c0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
112d0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
112e0 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
112f0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11300 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
11310 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
11320 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
11330 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
11340 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
11350 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  for sqlite3Selec
11360 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  t()..** See the 
11370 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
11380 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
11390 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
113a0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
113b0 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d  atic int simpleM
113c0 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
113d0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
113e0 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
113f0 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78  int iParm){.  Ex
11400 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
11410 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
11420 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
11430 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
11440 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
11450 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20  t seekOp;.  int 
11460 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  cont;.  ExprList
11470 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
11480 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
11490 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
114a0 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
114b0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20 20 2f  List *pSrc;..  /
114c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
114d0 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
114e0 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
114f0 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
11500 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
11510 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
11520 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
11530 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
11540 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
11550 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
11560 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
11570 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
11580 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11590 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
115a0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
115b0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
115c0 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
115d0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
115e0 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
115f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
11600 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
11610 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
11620 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
11630 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
11640 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
11650 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
11660 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
11670 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
11680 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
11690 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
116a0 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
116b0 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
116c0 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
116d0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
116e0 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
116f0 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
11700 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
11710 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
11720 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
11730 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
11740 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11750 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
11760 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
11770 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
11780 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
11790 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
117a0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
117b0 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
117c0 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
117d0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
117e0 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
117f0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
11800 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
11810 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
11820 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
11830 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
11840 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
11850 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
11860 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
11870 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
11880 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
11890 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
118a0 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
118b0 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
118c0 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
118d0 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
118e0 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
118f0 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
11900 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
11910 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
11920 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
11930 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11940 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72   pExpr);.    for
11950 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11960 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11970 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11980 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11990 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
119a0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
119b0 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
119c0 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66   && pIdx->keyInf
119d0 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c  o.aColl[0]==pCol
119e0 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
119f0 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
11a00 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
11a10 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
11a20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
11a30 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
11a40 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
11a50 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
11a60 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
11a70 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
11a80 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
11a90 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
11aa0 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
11ab0 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
11ac0 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
11ad0 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
11ae0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
11af0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11b00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11b10 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
11b20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
11b30 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
11b40 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
11b50 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
11b60 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
11b70 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11b80 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b 0a 20 20  _TempTable ){.  
11b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ba0 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
11bb0 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tual, iParm, 1);
11bc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
11bd0 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
11be0 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
11bf0 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
11c00 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
11c10 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
11c20 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
11c30 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
11c40 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
11c50 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
11c60 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
11c70 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
11c80 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
11c90 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
11ca0 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
11cb0 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
11cc0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  table..  */.  sq
11cd0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
11ce0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
11cf0 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65  ab->iDb);.  base
11d00 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43   = pSrc->a[0].iC
11d10 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65  ursor;.  compute
11d20 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
11d30 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
11d40 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
11d50 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
11d60 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f  lite3OpenTableFo
11d70 72 52 65 61 64 69 6e 67 28 76 2c 20 62 61 73 65  rReading(v, base
11d80 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63  , pTab);.  }.  c
11d90 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11da0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11db0 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
11dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11dd0 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
11de0 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
11df0 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  e{.    /* Even t
11e00 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72  hough the cursor
11e10 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
11e20 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20  e index here is 
11e30 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  closed.    ** as
11e40 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c   soon as a singl
11e50 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  e value has been
11e60 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61   read from it, a
11e70 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a  llocate it.    *
11e80 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d  * using (pParse-
11e90 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76  >nTab++) to prev
11ea0 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  ent the cursor i
11eb0 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20  d from being .  
11ec0 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69    ** reused. Thi
11ed0 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  s is important f
11ee0 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  or statements of
11ef0 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a   the form .    *
11f00 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  * "INSERT INTO x
11f10 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52   SELECT max() FR
11f20 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  OM x"..    */.  
11f30 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20    int iIdx;.    
11f40 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
11f50 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
11f60 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11f70 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d  P_Integer, pIdx-
11f80 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  >iDb, 0);.    sq
11f90 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
11fa0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
11fb0 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20  x, pIdx->tnum,. 
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e    (char*)&pIdx->
11fe0 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
11ff0 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20 73 65  NFO);.    if( se
12000 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
12010 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12020 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12030 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
12040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12050 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
12060 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  cord, 1, 0);.   
12070 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
12080 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20  oveGt;.    }.   
12090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120a0 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
120b0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
120c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
120d0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
120e0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
120f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12100 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
12110 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12120 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
12130 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
12140 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
12150 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
12160 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
12170 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
12180 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
12190 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
121a0 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
121b0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
121c0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
121d0 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
121e0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
121f0 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74  Parm, cont, cont
12200 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
12210 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12220 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
12230 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12240 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20  OP_Close, base, 
12250 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  0);.  .  return 
12260 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  1;.}../*.** Anal
12270 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59  yze and ORDER BY
12280 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
12290 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20  use in a SELECT 
122a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
122b0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
122c0 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
122d0 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20  .**.** An ORDER 
122e0 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69  BY or GROUP BY i
122f0 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
12300 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79  essions.  If any
12310 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
12320 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
12330 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74  stant, then that
12340 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
12350 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a  eplaced by the.*
12360 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
12370 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65 73  entry in the res
12380 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
12390 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72  ic int processOr
123a0 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61  derGroupBy(.  Na
123b0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
123c0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
123d0 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ext of the SELEC
123e0 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  T statement. */.
123f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
12400 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f  erBy,   /* The O
12410 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
12420 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
12430 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
12440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
12450 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
12460 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
12470 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
12480 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
12490 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
124a0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
124b0 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72  st;     /* The r
124c0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
124d0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72   SELECT */.  Par
124e0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
124f0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a  ->pParse;     /*
12500 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
12510 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f  of the SELECT */
12520 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
12530 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  t );..  if( pOrd
12540 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
12550 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
12560 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
12570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
12580 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a  iCol;.    Expr *
12590 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
125a0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
125b0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
125c0 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
125d0 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
125e0 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d  iCol>0 && iCol<=
125f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
12600 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12610 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
12620 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
12630 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
12640 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
12650 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
12660 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
12670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12680 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12690 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
126a0 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c        "%s BY col
126b0 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75  umn number %d ou
126c0 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
126d0 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
126e0 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
126f0 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69  nd %d", zType, i
12700 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  Col, pEList->nEx
12710 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
12720 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
12730 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12740 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
12750 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b  ames(pNC, pE) ){
12760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
12770 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
12780 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
12790 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20  tant(pE) ){.    
127a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
127b0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
127c0 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d 73      "%s BY terms
127d0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e   must not be non
127e0 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e  -integer constan
127f0 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20  ts", zType);.   
12800 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
12810 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12820 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12830 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
12840 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64  s any names used
12850 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
12860 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70  et of the.** sup
12870 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74 61  plied SELECT sta
12880 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53  tement. If the S
12890 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
128a0 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a  being resolved.*
128b0 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63  * is a sub-selec
128c0 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43  t, then pOuterNC
128d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
128e0 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74   the NameContext
128f0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65   .** of the pare
12900 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e  nt SELECT..*/.in
12910 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  t sqlite3SelectR
12920 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20  esolve(.  Parse 
12930 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12940 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
12950 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
12960 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
12970 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
12980 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
12990 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
129a0 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
129b0 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72  NC  /* The outer
129c0 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d   name context. M
129d0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29  ay be NULL. */.)
129e0 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  {.  ExprList *pE
129f0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f  List;          /
12a00 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  * Result set. */
12a10 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a30 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62   For-loop variab
12a40 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69  le used in multi
12a50 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20  ple places */.  
12a60 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
12a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
12a80 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
12a90 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
12aa0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20  pGroupBy;       
12ab0 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79   /* The group by
12ac0 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
12ad0 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
12ae0 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c   has run before,
12af0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
12b00 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ely. */.  if( p-
12b10 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  >isResolved ){. 
12b20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75 74     assert( !pOut
12b30 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75  erNC );.    retu
12b40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12b50 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65  }.  p->isResolve
12b60 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  d = 1;..  /* If 
12b70 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65 61  there have alrea
12b80 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20  dy been errors, 
12b90 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20  do nothing. */. 
12ba0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
12bb0 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  r>0 ){.    retur
12bc0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12bd0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
12be0 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 61  e the select sta
12bf0 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c  tement. This cal
12c00 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20  l will allocate 
12c10 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  all cursors.  **
12c20 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
12c30 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20 61  dle the tables a
12c40 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  nd subqueries in
12c50 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
12c60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
12c70 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
12c80 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
12c90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12ca0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  R;.  }..  /* Res
12cb0 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
12cc0 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
12cd0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
12ce0 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a  uses. These.  **
12cf0 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
12d00 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
12d10 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
12d20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
12d30 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43  text..  */.  sNC
12d40 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
12d50 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20 3d  ;.  sNC.hasAgg =
12d60 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20 3d   0;.  sNC.nErr =
12d70 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20 3d   0;.  sNC.nRef =
12d80 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74   0;.  sNC.pEList
12d90 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c 6f   = 0;.  sNC.allo
12da0 77 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43 2e  wAgg = 0;.  sNC.
12db0 70 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20 20  pSrcList = 0;.  
12dc0 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
12dd0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12de0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
12df0 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c  C, p->pLimit) ||
12e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12e10 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
12e20 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  sNC, p->pOffset)
12e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12e40 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
12e50 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  ..  /* Set up th
12e60 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  e local name-con
12e70 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
12e80 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
12e90 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c  () to.  ** resol
12ea0 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ve the expressio
12eb0 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 73  n-list..  */.  s
12ec0 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b  NC.allowAgg = 1;
12ed0 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
12ee0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e 43  = p->pSrc;.  sNC
12ef0 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
12f00 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  C;..  /* Resolve
12f10 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
12f20 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 70  sult set. */.  p
12f30 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
12f40 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73 74  t;.  if( !pEList
12f50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12f60 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69 3d  _ERROR;.  for(i=
12f70 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
12f80 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
12f90 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d  pr *pX = pEList-
12fa0 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
12fb0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
12fc0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
12fd0 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
12fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12ff0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
13000 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
13010 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  e no aggregate f
13020 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
13030 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20  result-set, and 
13040 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 2a  no GROUP BY .  *
13050 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f  * expression, do
13060 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65   not allow aggre
13070 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20  gates in any of 
13080 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
13090 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  sions..  */.  as
130a0 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67 20  sert( !p->isAgg 
130b0 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  );.  pGroupBy = 
130c0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 69  p->pGroupBy;.  i
130d0 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73  f( pGroupBy || s
130e0 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  NC.hasAgg ){.   
130f0 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20   p->isAgg = 1;. 
13100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e   }else{.    sNC.
13110 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20  allowAgg = 0;.  
13120 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56  }..  /* If a HAV
13130 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72  ING clause is pr
13140 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72  esent, then ther
13150 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55  e must be a GROU
13160 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  P BY clause..  *
13170 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  /.  if( p->pHavi
13180 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20  ng && !pGroupBy 
13190 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
131a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
131b0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
131c0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
131d0 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
131e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
131f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
13200 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65 73  * Add the expres
13210 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  sion list to the
13220 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65   name-context be
13230 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65  fore parsing the
13240 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72  .  ** other expr
13250 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53  essions in the S
13260 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
13270 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
13280 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
13290 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
132a0 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e  lause (etc.) can
132b0 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73   refer to expres
132c0 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61 6c  sions by.  ** al
132d0 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73  iases in the res
132e0 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ult set..  **.  
132f0 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20  ** Minor point: 
13300 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
13310 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ase, then the ex
13320 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65  pression will be
13330 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74  .  ** re-evaluat
13340 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
13350 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 2a  rence to it..  *
13360 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d  /.  sNC.pEList =
13370 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
13380 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
13390 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20  olveNames(&sNC, 
133a0 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20  p->pWhere) ||.  
133b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52      sqlite3ExprR
133c0 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43  esolveNames(&sNC
133d0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c 7c  , p->pHaving) ||
133e0 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72  .      processOr
133f0 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
13400 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
13410 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20  RDER") ||.      
13420 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
13430 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75 70  pBy(&sNC, 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 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
13480 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
13490 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  se does not cont
134a0 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75  ain aggregate fu
134b0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
134c0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
134d0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
134e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
134f0 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  .  .    for(i=0,
13500 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
13510 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e  >a; i<pGroupBy->
13520 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
13530 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
13540 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13550 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pItem->pExpr, EP
13560 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
13570 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13580 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67  (pParse, "aggreg
13590 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ate functions ar
135a0 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
135b0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
135c0 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
135d0 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  use");.        r
135e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
135f0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
13600 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
13610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13620 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
13630 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
13640 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
13650 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
13660 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
13670 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
13680 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
13690 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
136a0 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
136b0 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
136c0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
136d0 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
136e0 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
136f0 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
13700 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13710 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
13720 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
13730 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
13740 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
13750 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
13760 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
13770 61 64 64 72 3b 0a 20 20 69 66 28 20 70 41 67 67  addr;.  if( pAgg
13780 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
13790 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
137a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
137b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
137c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
137d0 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28  l, 0, 0);.  for(
137e0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
137f0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
13800 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13810 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13820 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 41 67 67  P_MemStore, pAgg
13830 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
13840 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f  em, 0);.  }.  fo
13850 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
13860 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
13870 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13880 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13890 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 41 67 67  P_MemStore, pAgg
138a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
138b0 4d 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  Mem, 0);.  }.  s
138c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
138d0 50 32 28 76 2c 20 61 64 64 72 2c 20 31 29 3b 0a  P2(v, addr, 1);.
138e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
138f0 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
13900 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
13910 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
13920 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
13930 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
13940 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
13950 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
13960 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
13970 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
13980 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
13990 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
139a0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
139b0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
139c0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
139d0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
139e0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
139f0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
13a00 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
13a10 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
13a20 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
13a30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
13a40 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p3(v, OP_AggFina
13a50 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
13a60 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
13a70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r : 0,.         
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
13a90 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
13aa0 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  3_FUNCDEF);.  }.
13ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
13ac0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
13ad0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
13ae0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
13af0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
13b00 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
13b10 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
13b20 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
13b30 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
13b40 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
13b50 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
13b60 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13b70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
13b80 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
13b90 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
13ba0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
13bb0 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
13bc0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
13bd0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
13be0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
13bf0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
13c00 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
13c10 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
13c20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13c30 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
13c40 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
13c50 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
13c60 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
13c70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13c80 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
13c90 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
13ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13cb0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
13cc0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
13cd0 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29  c->needCollSeq )
13ce0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
13cf0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
13d00 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13d10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
13d20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
13d30 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
13d40 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
13d50 6c 20 26 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45  l && j<pList->nE
13d60 78 70 72 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; j++, pItem+
13d70 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
13d80 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
13d90 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
13da0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
13db0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13dc0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
13dd0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
13de0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
13df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13e00 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13e10 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
13e20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
13e30 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
13e40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13e50 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
13e60 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c  gStep, pF->iMem,
13e70 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a 29 70 46   nArg, (void*)pF
13e80 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
13e90 44 45 46 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  DEF);.  }.  for(
13ea0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
13eb0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
13ec0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
13ed0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
13ee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13ef0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
13f00 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
13f10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13f20 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
13f30 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
13f40 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
13f50 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ode = 0;.}.../*.
13f60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
13f70 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
13f80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
13f90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
13fa0 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
13fb0 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
13fc0 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
13fd0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
13fe0 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
13ff0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
14000 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
14010 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
14020 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14050 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
14060 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
14070 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
14080 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
14090 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
140a0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
140b0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
140c0 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
140d0 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
140e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
140f0 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
14100 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
14110 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  of table iParm..
14120 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
14130 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
14140 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
14150 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
14160 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
14170 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
14180 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
14190 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
141a0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
141b0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
141c0 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
141d0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
141e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
141f0 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
14200 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
14210 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
14220 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
14230 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
14240 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
14250 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
14260 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
14270 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
14280 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
14290 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
142a0 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
142b0 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
142c0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
142d0 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
142e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
142f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
14300 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
14310 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
14320 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
14330 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
14340 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
14350 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
14360 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
14370 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
14380 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
14390 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
143a0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
143b0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
143c0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
143d0 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
143e0 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
143f0 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
14400 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
14410 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
14420 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
14430 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
14440 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
14450 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
14460 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
14470 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
14480 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
14490 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
144a0 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
144b0 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
144c0 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
144d0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
144e0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
144f0 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
14500 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
14510 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
14520 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
14530 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
14540 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
14550 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
14560 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
14570 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
14580 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
14590 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
145a0 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
145b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
145c0 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
145d0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
145e0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
145f0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
14600 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
14610 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
14650 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
14660 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
14670 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
14680 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
14690 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
146a0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
146b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
146c0 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
146d0 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
146e0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
146f0 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
14700 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
14710 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
14720 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
14730 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
14740 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
14750 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
14760 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
14770 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
14780 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
14790 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
147a0 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
147b0 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
147c0 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
147d0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
147e0 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
147f0 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
14800 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
14810 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
14820 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
14830 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
14840 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14860 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
14870 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14890 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
148a0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
148b0 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
148c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
148d0 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
148e0 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
148f0 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
14900 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
14910 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
14920 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
14930 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
14940 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
14950 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
14960 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
14970 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
14980 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
14990 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
149a0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
149b0 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
149c0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
149d0 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
149e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
149f0 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
14a00 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
14a10 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a30 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
14a40 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
14a50 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
14a60 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
14a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
14a80 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
14a90 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
14aa0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
14ab0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
14ac0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
14ad0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
14ae0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
14af0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
14b00 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14b10 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14b30 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
14b40 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
14b50 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
14b60 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
14b70 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
14b80 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
14b90 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
14ba0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
14bb0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
14bc0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
14bd0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
14be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14bf0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
14c00 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
14c10 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
14c20 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
14c30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
14c40 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14c50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
14c60 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
14c70 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
14c80 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
14c90 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
14ca0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
14cb0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
14cc0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
14cd0 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
14ce0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
14cf0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
14d00 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
14d10 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
14d20 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
14d30 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
14d40 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
14d50 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
14d60 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
14d70 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
14d80 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
14d90 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49  nction */.  AggI
14da0 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
14db0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
14dc0 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
14dd0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a  ate queries */..
14de0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61    if( sqlite3_ma
14df0 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c 7c 20 70  lloc_failed || p
14e00 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
14e10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
14e20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14e30 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14e40 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
14e50 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
14e60 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
14e70 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
14e80 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 23 69  (sAggInfo));..#i
14e90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ea0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
14eb0 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
14ec0 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
14ed0 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
14ee0 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
14ef0 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
14f00 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
14f10 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
14f20 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20  htmost==0 ){.   
14f30 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
14f40 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f  ;.      for(pLoo
14f50 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
14f60 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
14f70 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
14f80 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
14f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14fa0 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
14fb0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14fc0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
14fd0 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ff);.  }.#endif.
14fe0 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
14ff0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >pOrderBy;.  if(
15000 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
15010 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
15020 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
15030 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
15040 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
15050 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b  pParse, p, 0) ){
15060 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
15070 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  _end;.  }.  p->p
15080 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
15090 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c  By;..  /* Make l
150a0 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74  ocal copies of t
150b0 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  he parameters fo
150c0 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20  r this query..  
150d0 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  */.  pTabList = 
150e0 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72  p->pSrc;.  pWher
150f0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
15100 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
15110 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
15120 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
15130 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  .  isAgg = p->is
15140 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  Agg;.  isDistinc
15150 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
15160 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  t;.  pEList = p-
15170 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
15180 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
15190 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
151a0 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
151b0 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
151c0 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
151d0 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
151e0 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
151f0 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
15200 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
15210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
15220 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
15230 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
15240 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
15250 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
15260 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
15270 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
15280 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
15290 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tput..  */.  ass
152a0 65 72 74 28 20 65 44 65 73 74 21 3d 53 52 54 5f  ert( eDest!=SRT_
152b0 45 78 69 73 74 73 20 7c 7c 20 70 45 4c 69 73 74  Exists || pEList
152c0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 23 69  ->nExpr==1 );.#i
152d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
152e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
152f0 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
15300 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
15310 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  et) && pEList->n
15320 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73 71  Expr>1 ){.    sq
15330 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15340 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69  arse, "only a si
15350 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
15360 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20  wed for ".      
15370 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20   "a SELECT that 
15380 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
15390 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
153a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
153b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
153c0 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
153d0 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64  nored for some d
153e0 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a  estinations..  *
153f0 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  /.  if( Ignorabl
15400 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
15410 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
15420 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  = 0;.  }..  /* B
15430 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
15440 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
15450 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15460 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
15470 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
15480 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65  t_end;..  /* Ide
15490 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
154a0 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
154b0 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
154c0 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
154d0 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
154e0 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
154f0 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
15500 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
15510 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
15520 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
15530 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65  llback ){.    ge
15540 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
15550 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
15560 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
15570 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15580 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
15590 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
155a0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
155b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
155c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
155d0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
155e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
155f0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
15600 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
15610 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
15620 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
15630 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
15640 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43  int needRestoreC
15650 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75  ontext;.    stru
15660 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15670 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
15680 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69  st->a[i];..    i
15690 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
156a0 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
156b0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
156c0 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  zName!=0 ){.    
156d0 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
156e0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
156f0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
15700 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
15710 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e  ontext = pItem->
15720 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65  zName;.      nee
15730 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
15740 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
15750 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
15760 65 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20  eContext = 0;.  
15770 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
15780 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49  elect(pParse, pI
15790 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  tem->pSelect, SR
157a0 54 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20  T_TempTable, .  
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
157c0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
157d0 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b  , i, &isAgg, 0);
157e0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
157f0 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
15800 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
15810 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
15820 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
15830 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
15840 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
15850 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
15860 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67  ere;.    if( !Ig
15870 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65  norableOrderby(e
15880 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
15890 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
158a0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
158b0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
158c0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
158d0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
158e0 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
158f0 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
15900 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
15910 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
15920 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
15930 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
15940 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
15950 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
15960 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
15970 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
15980 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
15990 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
159a0 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
159b0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
159c0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
159d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
159e0 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
159f0 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
15a00 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
15a10 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
15a20 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
15a30 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
15a40 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
15a50 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
15a60 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53   .  */.#ifndef S
15a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
15a80 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
15a90 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
15aa0 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
15ab0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
15ac0 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
15ad0 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
15ae0 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
15af0 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
15b00 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  Agg = 1;.    got
15b10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
15b20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
15b30 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
15b40 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72  DER BY clause, r
15b50 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61  esolve any colla
15b60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20  tion sequences. 
15b70 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68   ** names that h
15b80 61 76 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69  ave been explici
15b90 74 6c 79 20 73 70 65 63 69 66 69 65 64 2e 0a 20  tly specified.. 
15ba0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
15bb0 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  By ){.    struct
15bc0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15bd0 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79 49 6e  pTerm;.    KeyIn
15be0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
15bf0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
15c00 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
15c10 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
15c20 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
15c30 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
15c40 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 7a      if( pTerm->z
15c50 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
15c60 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  pTerm->pExpr->pC
15c70 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
15c80 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
15c90 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 2c  e, pTerm->zName,
15ca0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
15cb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
15cc0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
15cd0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
15ce0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  d;.    }.    pKe
15cf0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
15d00 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
15d10 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
15d20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61     pOrderBy->iTa
15d30 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
15d40 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  ++;.    addr = s
15d50 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
15d60 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
15d70 20 70 4f 72 64 65 72 42 79 2d 3e 69 54 61 62 2c   pOrderBy->iTab,
15d80 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
15d90 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  +2, .           
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15db0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
15dc0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
15dd0 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  );.    p->addrOp
15de0 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64 64 72  enVirt[2] = addr
15df0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
15e00 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
15e10 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
15e20 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15e30 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  , p);..  /* If t
15e40 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
15e50 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
15e60 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
15e70 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
15e80 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
15e90 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29 7b  SRT_TempTable ){
15ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15eb0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
15ec0 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20  Virtual, iParm, 
15ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
15ee0 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 6e 69 74 69    }...  /* Initi
15ef0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
15f00 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20 66 6f   cell to NULL fo
15f10 72 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30 20 66  r SRT_Mem or 0 f
15f20 6f 72 20 53 52 54 5f 45 78 69 73 74 73 0a 20 20  or SRT_Exists.  
15f30 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
15f40 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
15f50 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  ==SRT_Exists ){.
15f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f70 64 64 4f 70 28 76 2c 20 65 44 65 73 74 3d 3d 53  ddOp(v, eDest==S
15f80 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f 4e 75 6c 6c  RT_Mem ? OP_Null
15f90 20 3a 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30   : OP_Integer, 0
15fa0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15fb0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15fc0 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
15fd0 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
15fe0 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
15ff0 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
16000 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
16010 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
16020 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
16030 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16040 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
16050 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
16060 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
16070 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
16080 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
16090 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
160a0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
160b0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 64 69  _OpenVirtual, di
160c0 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20  stinct, 0, .    
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
160f0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
16100 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73  HANDOFF);.  }els
16110 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  e{.    distinct 
16120 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
16130 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f  Aggregate and no
16140 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
16150 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ies are handled 
16160 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20  differently */. 
16170 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
16180 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
16190 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69    /* This case i
161a0 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67  s for non-aggreg
161b0 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20  ate queries.    
161c0 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  ** Begin the dat
161d0 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a  abase scan.    *
161e0 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
161f0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
16200 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
16210 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64  t, pWhere, &pOrd
16220 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
16230 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
16240 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
16250 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
16260 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
16270 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
16280 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
16290 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
162a0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
162b0 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
162c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
162d0 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
162e0 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
162f0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
16300 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20   aff) ){.       
16310 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
16320 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
16330 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
16340 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
16350 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
16360 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
16370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
16380 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
16390 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
163a0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
163b0 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
163c0 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
163d0 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
163e0 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
163f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
16400 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
16410 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
16420 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
16430 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
16440 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
16450 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
16460 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
16470 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
16480 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
16490 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
164a0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
164b0 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
164c0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
164d0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
16500 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
16510 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
16520 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
16550 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
16560 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
16570 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
16580 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
16590 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
165a0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
165b0 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
165c0 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
165d0 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
165e0 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20  der */...    /* 
165f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
16600 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64  riables hold add
16610 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73  resses or labels
16620 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68   for parts of th
16630 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  e.    ** virtual
16640 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d   machine program
16650 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20   we are putting 
16660 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20  together */.    
16670 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
16680 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  w;      /* Start
16690 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
166a0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
166b0 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
166c0 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
166d0 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ;       /* Set t
166e0 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
166f0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
16700 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69  int addrInitiali
16710 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74  zeLoop; /* Start
16720 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e   of code that in
16730 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e  itializes the in
16740 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
16750 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
16760 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  p;      /* Top o
16770 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
16780 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
16790 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20  GroupByChange;  
167a0 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e  /* Code that run
167b0 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50  s when any GROUP
167c0 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73   BY term changes
167d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
167e0 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20  ProcessRow;     
167f0 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65  /* Code to proce
16800 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75  ss a single inpu
16810 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
16820 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
16830 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61       /* End of a
16840 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  ll processing */
16850 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72  .    int addrSor
16860 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20  tingIdx;     /* 
16870 54 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  The OP_OpenVirtu
16880 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
16890 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20  ng index */..   
168a0 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
168b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
168c0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
168d0 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
168e0 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
168f0 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
16900 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
16910 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
16920 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
16930 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
16940 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
16950 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
16960 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
16970 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
16980 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
16990 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
169a0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
169b0 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
169c0 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
169d0 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
169e0 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
169f0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
16a00 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
16a10 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
16a20 3a 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  : 0;.    if( sql
16a30 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
16a40 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
16a50 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ist) ){.      go
16a60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
16a70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
16a80 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
16a90 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
16aa0 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20  derBy) ){.      
16ab0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
16ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16ad0 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
16ae0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
16af0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
16b00 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
16b10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
16b20 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
16b30 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
16b40 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
16b50 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
16b60 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
16b70 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
16b80 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
16b90 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
16ba0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
16bb0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73  c[i].pExpr->pLis
16bc0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  t) ){.        go
16bd0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
16be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16bf0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
16c00 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 67 6f 74  loc_failed ) got
16c10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
16c20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
16c30 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
16c40 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
16c50 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
16c60 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
16c70 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
16c80 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
16c90 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
16ca0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
16cb0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
16cc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16cd0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
16ce0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
16cf0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
16d00 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  se */..      /* 
16d10 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
16d20 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
16d30 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
16d40 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49      .      addrI
16d50 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
16d60 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16d70 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
16d80 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
16d90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16da0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16db0 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77    addrProcessRow
16dc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16dd0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
16de0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
16df0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
16e00 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
16e10 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
16e20 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
16e30 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
16e40 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
16e50 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
16e60 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
16e70 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
16e80 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
16e90 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
16ea0 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
16eb0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
16ec0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
16ed0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
16ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
16ef0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
16f00 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
16f10 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
16f20 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
16f30 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
16f40 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
16f50 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
16f60 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  x =.          sq
16f70 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
16f80 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
16f90 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
16fa0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41                sA
16fc0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
16fd0 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
17000 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
17010 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  OFF);..      /* 
17020 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
17030 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
17040 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
17050 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
17060 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
17070 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50 61 72   iUseFlag = pPar
17080 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
17090 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 70    iAbortFlag = p
170a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
170b0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
170c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
170d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
170e0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
170f0 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
17100 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17110 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
17120 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
17130 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
17140 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
17150 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
17160 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17170 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
17180 65 6d 53 74 6f 72 65 2c 20 69 41 62 6f 72 74 46  emStore, iAbortF
17190 6c 61 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  lag, 0);.      s
171a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
171b0 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
171c0 69 55 73 65 46 6c 61 67 2c 20 31 29 3b 0a 20 20  iUseFlag, 1);.  
171d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
171e0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  ddOp(v, OP_Null,
171f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
17200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
17210 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
17220 41 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  AMem, 1);.      
17230 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17240 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
17250 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
17260 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  op);..      /* G
17270 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
17280 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
17290 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
172a0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
172b0 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
172c0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
172d0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
172e0 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
172f0 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
17300 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
17310 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
17320 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
17330 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
17340 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
17350 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
17360 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
17370 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
17380 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
17390 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
173a0 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
173b0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
173c0 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
173d0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
173e0 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
173f0 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
17400 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
17410 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
17420 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
17430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17440 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
17450 6d 49 6e 63 72 2c 20 69 41 62 6f 72 74 46 6c 61  mIncr, iAbortFla
17460 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  g, 0);.      sql
17470 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17480 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
17490 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
174a0 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
174b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
174c0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
174d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
174e0 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46  _IfMemPos, iUseF
174f0 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
17500 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow+2);.      sql
17510 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17520 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
17530 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
17540 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
17550 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
17560 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
17570 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
17580 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
17590 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
175a0 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
175b0 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, 1);.      }.
175c0 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63        rc = selec
175d0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
175e0 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
175f0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
17600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17610 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
17620 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69 50 61  inct, eDest, iPa
17630 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17650 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
17660 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c 20 61   addrSetAbort, a
17670 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
17680 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
17690 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
176a0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
176b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
176c0 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29  OP_Return, 0, 0)
176d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
176e0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
176f0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
17700 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
17710 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
17720 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
17730 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
17740 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
17750 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
17760 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
17770 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
17780 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
17790 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
177a0 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
177b0 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
177c0 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
177d0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
177e0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
177f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17800 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
17810 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
17820 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
17830 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
17840 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
17850 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70  List, pWhere, &p
17860 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
17870 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
17880 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
17890 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
178a0 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
178b0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
178c0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
178d0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
178e0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
178f0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
17900 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
17910 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 56  t.  The OP_OpenV
17920 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c  irtual table wil
17930 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
17940 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
17950 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
17960 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
17970 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
17980 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
17990 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
179a0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
179b0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
179c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
179d0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
179e0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
179f0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
17a00 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
17a10 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
17a20 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
17a30 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
17a40 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
17a50 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
17a60 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
17a70 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
17a80 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
17a90 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
17aa0 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
17ab0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
17ac0 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
17ad0 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  BySort = 1;.    
17ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17af0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
17b00 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
17b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17b20 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
17b30 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
17b40 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b  .sortingIdx, 0);
17b50 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72  .        j = pGr
17b60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a  oupBy->nExpr+1;.
17b70 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
17b80 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
17b90 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
17ba0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
17bb0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
17bc0 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
17bd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
17be0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
17bf0 6c 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75  lumn<j ) continu
17c00 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
17c10 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30   pCol->iColumn<0
17c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17c40 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 43  (v, OP_Rowid, pC
17c50 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  ol->iTable, 0);.
17c60 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
17c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17c80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17c90 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c   OP_Column, pCol
17ca0 2d 3e 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e  ->iTable, pCol->
17cb0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
17cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17cd0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j++;.        }. 
17ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17cf0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
17d00 6b 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b  keRecord, j, 0);
17d10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17d20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17d30 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
17d40 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
17d50 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
17d60 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
17d70 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
17d80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
17d90 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e   OP_Sort, sAggIn
17da0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
17db0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
17dc0 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
17dd0 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  x = 1;.      }..
17de0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
17df0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
17e00 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64  OUP BY terms and
17e10 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31   store in b0, b1
17e20 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  , b2....      **
17e30 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c   (b0 is memory l
17e40 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c  ocation iBMem+0,
17e50 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20   b1 is iBMem+1, 
17e60 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20  and so forth).  
17e70 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70      ** Then comp
17e80 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
17e90 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
17ea0 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50  gainst the GROUP
17eb0 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20   BY terms.      
17ec0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  ** from the prev
17ed0 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74  ious row current
17ee0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c  ly stored in a0,
17ef0 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20   a1, a2....     
17f00 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f   */.      addrTo
17f10 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  pOfLoop = sqlite
17f20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17f30 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  (v);.      for(j
17f40 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
17f50 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
17f60 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
17f70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
17f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17f90 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
17fa0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
17fb0 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20  gIdx, j);.      
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17fd0 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
17fe0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
17ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18000 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
18010 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
18020 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
18030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18040 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
18050 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c  mStore, iBMem+j,
18060 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
18070 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pr-1);.      }. 
18080 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75       for(j=pGrou
18090 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e  pBy->nExpr-1; j>
180a0 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
180b0 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79    if( j<pGroupBy
180c0 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
180d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
180e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
180f0 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20  mLoad, iBMem+j, 
18100 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
18110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18120 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
18130 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30  Load, iAMem+j, 0
18140 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
18150 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
18160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18170 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20 61  p(v, OP_Eq, 0, a
18180 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a  ddrProcessRow);.
18190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
181a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
181b0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
181c0 4e 65 2c 20 30 78 31 30 30 2c 20 61 64 64 72 47  Ne, 0x100, addrG
181d0 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20  roupByChange);. 
181e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
181f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
18200 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f 69  geP3(v, -1, (voi
18210 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  d*)pKeyInfo->aCo
18220 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45  ll[j], P3_COLLSE
18230 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  Q);.      }..   
18240 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
18250 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
18260 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
18270 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
18280 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20     ** Change in 
18290 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
182a0 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
182b0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
182c0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
182d0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
182e0 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
182f0 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
18300 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
18310 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
18320 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
18330 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
18340 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
18350 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
18360 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
18370 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
18380 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
18390 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
183a0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
183b0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
183c0 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
183d0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
183e0 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
183f0 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
18400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18410 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18420 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61  , addrGroupByCha
18430 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  nge);.      for(
18440 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
18450 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
18460 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18470 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
18480 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30  Load, iBMem+j, 0
18490 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
184a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
184b0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 41 4d 65  P_MemStore, iAMe
184c0 6d 2b 6a 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  m+j, 1);.      }
184d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
184e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
184f0 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70  sub, 0, addrOutp
18500 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
18510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18520 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
18530 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45  AbortFlag, addrE
18540 6e 64 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  nd);.      reset
18550 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
18560 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
18570 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
18580 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
18590 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
185a0 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
185b0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
185c0 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
185d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
185e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
185f0 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65  bel(v, addrProce
18600 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70  ssRow);.      up
18610 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
18620 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
18630 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
18640 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18650 5f 4d 65 6d 49 6e 63 72 2c 20 69 55 73 65 46 6c  _MemIncr, iUseFl
18660 61 67 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f  ag, 0);..      /
18670 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
18680 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
18690 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
186a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
186b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
186c0 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
186d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
186e0 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
186f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18700 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
18710 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
18720 20 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74      uncreateSort
18730 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
18740 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
18750 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
18760 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
18770 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
18780 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
18790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
187a0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
187b0 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  0, addrOutputRow
187c0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20  );.      .    } 
187d0 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42  /* endif pGroupB
187e0 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  y */.    else {.
187f0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
18800 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
18810 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
18820 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
18830 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70    The.      ** p
18840 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
18850 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
18860 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
18870 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
18880 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
18890 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
188a0 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
188b0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
188c0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
188d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
188e0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
188f0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29  List, pWhere, 0)
18900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
18910 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
18920 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75  ect_end;.      u
18930 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
18940 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
18950 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
18960 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
18970 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  o);.      finali
18980 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
18990 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
189a0 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  );.      pOrderB
189b0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
189c0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
189d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
189e0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
189f0 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c  Having, addrEnd,
18a00 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
18a10 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
18a20 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
18a30 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30  >pEList, 0, 0, 0
18a40 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20  , -1, .         
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44 65               eDe
18a60 73 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45  st, iParm, addrE
18a70 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66  nd, addrEnd, aff
18a80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
18a90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18aa0 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29  abel(v, addrEnd)
18ab0 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e  ;.    .  } /* en
18ac0 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75  dif aggregate qu
18ad0 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ery */..  /* If 
18ae0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
18af0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
18b00 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
18b10 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
18b20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
18b30 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
18b40 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
18b50 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
18b60 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
18b70 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
18b80 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e   p, v, pEList->n
18b90 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
18ba0 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rm);.  }..#ifnde
18bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
18bc0 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74  BQUERY.  /* If t
18bd0 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75 65  his was a subque
18be0 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20  ry, we have now 
18bf0 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73 75  converted the su
18c00 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20  bquery into a.  
18c10 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
18c20 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74  le.  So delete t
18c30 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72 75  he subquery stru
18c40 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70  cture from the p
18c50 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72  arent.  ** to pr
18c60 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71 75  event this subqu
18c70 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65  ery from being e
18c80 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61  valuated again a
18c90 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a  nd to force the.
18ca0 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20    ** the use of 
18cb0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
18cc0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
18cd0 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
18ce0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
18cf0 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
18d00 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
18d10 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
18d20 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
18d30 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
18d40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
18d50 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50  elete(p);.    pP
18d60 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70  arent->pSrc->a[p
18d70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63  arentTab].pSelec
18d80 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  t = 0;.  }.#endi
18d90 66 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  f..  /* The SELE
18da0 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
18db0 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
18dc0 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
18dd0 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
18de0 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
18df0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
18e00 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
18e10 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
18e20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
18e30 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
18e40 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
18e50 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
18e60 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
18e70 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
18e80 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
18e90 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
18ea0 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f  iteFree(sAggInfo
18eb0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
18ec0 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.