/ Hex Artifact Content
Login

Artifact be02f123e8651bee22beb07d89dcfa75bcc2e291:


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 37 38  select.c,v 1.278
0200: 20 32 30 30 35 2f 31 31 2f 30 33 20 30 30 3a 34   2005/11/03 00:4
0210: 31 3a 31 37 20 64 72 68 20 45 78 70 20 24 0a 2a  1:17 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 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0970: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0980: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0990: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
09a0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
09b0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
09c0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
09d0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
09e0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
09f0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0a00: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0a10: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0a20: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0a30: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0a40: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0a50: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0a60: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a80: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a90: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0aa0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0ab0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0ac0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0ad0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0ae0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0af0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0b00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b10: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0b20: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0b30: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0b40: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0b50: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0b60: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b70: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b80: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b90: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0ba0: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0bb0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0bc0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0bd0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0be0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0bf0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0c00: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0c10: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0c20: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c30: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0c40: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0c50: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0c60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0c70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0c80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0c90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0ca0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0cb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0cc0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0cd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0ce0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
0cf0: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
0d00: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
0d10: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
0d20: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
0d30: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
0d40: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 2d 3e 7a  te3StrNICmp(p->z
0d50: 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b  , keywords[j].zK
0d60: 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30  eyword, p->n)==0
0d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
0d80: 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73  type |= keywords
0d90: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
0da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
0db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
0dc0: 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  >=sizeof(keyword
0dd0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0de0: 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ds[0]) ){.      
0df0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
0e00: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
0e10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
0e20: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
0e30: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
0e40: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
0e50: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
0e60: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
0e70: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
0e80: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
0e90: 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a  ar *zSp1 = " ";.
0ea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0eb0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
0ec0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70  if( pB==0 ){ zSp
0ed0: 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  1++; }.    if( p
0ee0: 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20  C==0 ){ zSp2++; 
0ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
0f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
0f10: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0f20: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0f30: 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25   ".       "%T%s%
0f40: 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31  T%s%T", pA, zSp1
0f50: 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b  , pB, zSp2, pC);
0f60: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
0f70: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
0f80: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
0f90: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
0fa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0fb0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0fc0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0fd0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0fe0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0ff0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1000: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1010: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1020: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1030: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1040: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1050: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1060: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
1070: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
1080: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1090: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
10a0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
10b0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
10c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
10d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
10e0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
10f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1100: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1110: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1120: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1130: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1140: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1150: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1160: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
1170: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
1180: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
1190: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
11a0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
11b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
11c0: 20 70 2d 3e 7a 20 3d 20 7a 3b 0a 20 20 70 2d 3e   p->z = z;.  p->
11d0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
11e0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
11f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20  /*.** Create an 
1200: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1210: 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  for an identifie
1220: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
1230: 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74  of zName.*/.stat
1240: 69 63 20 45 78 70 72 20 2a 63 72 65 61 74 65 49  ic Expr *createI
1250: 64 45 78 70 72 28 63 6f 6e 73 74 20 63 68 61 72  dExpr(const char
1260: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
1270: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
1280: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
1290: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
12a0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12b0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d  0, 0, &dummy);.}
12c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  .../*.** Add a t
12d0: 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45  erm to the WHERE
12e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a   expression in *
12f0: 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75  ppExpr that requ
1300: 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c  ires the.** zCol
1310: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71   column to be eq
1320: 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74  ual in the two t
1330: 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20  ables pTab1 and 
1340: 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  pTab2..*/.static
1350: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1360: 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rm(.  const char
1370: 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f   *zCol,        /
1380: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1390: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
13a0: 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20  Table *pTab1,   
13b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c     /* First tabl
13c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13d0: 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20  r *zAlias1,     
13e0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72  /* Alias for fir
13f0: 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  st table.  May b
1400: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  e NULL */.  cons
1410: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20  t Table *pTab2, 
1420: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74       /* Second t
1430: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1440: 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20  char *zAlias2,  
1450: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1460: 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d  second table.  M
1470: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1480: 69 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  int iRightJoinTa
1490: 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45  ble,     /* VDBE
14a0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
14b0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
14c0: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
14d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
14e0: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
14f0: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
1500: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  ssion */.){.  Ex
1510: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1520: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1530: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1540: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1550: 0a 20 20 70 45 31 61 20 3d 20 63 72 65 61 74 65  .  pE1a = create
1560: 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20  IdExpr(zCol);.  
1570: 70 45 32 61 20 3d 20 63 72 65 61 74 65 49 64 45  pE2a = createIdE
1580: 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  xpr(zCol);.  if(
1590: 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20   zAlias1==0 ){. 
15a0: 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61     zAlias1 = pTa
15b0: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b1->zName;.  }. 
15c0: 20 70 45 31 62 20 3d 20 63 72 65 61 74 65 49 64   pE1b = createId
15d0: 45 78 70 72 28 7a 41 6c 69 61 73 31 29 3b 0a 20  Expr(zAlias1);. 
15e0: 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20   if( zAlias2==0 
15f0: 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d  ){.    zAlias2 =
1600: 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab2->zName;. 
1610: 20 7d 0a 20 20 70 45 32 62 20 3d 20 63 72 65 61   }.  pE2b = crea
1620: 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 32  teIdExpr(zAlias2
1630: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1640: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
1650: 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a  pE1b, pE1a, 0);.
1660: 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33    pE2c = sqlite3
1670: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32  Expr(TK_DOT, pE2
1680: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
1690: 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  E = sqlite3Expr(
16a0: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
16b0: 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74  c, 0);.  ExprSet
16c0: 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
16d0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 70 45 2d  FromJoin);.  pE-
16e0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
16f0: 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62   = iRightJoinTab
1700: 6c 65 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20  le;.  *ppExpr = 
1710: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 2a  sqlite3ExprAnd(*
1720: 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a  ppExpr, pE);.}..
1730: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
1740: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
1750: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1760: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1770: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20  ression..** And 
1780: 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69  set the Expr.iRi
1790: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20  ghtJoinTable to 
17a0: 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79  iTable for every
17b0: 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20   term in the.** 
17c0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
17d0: 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  * The EP_FromJoi
17e0: 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  n property is us
17f0: 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61  ed on terms of a
1800: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1810: 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54  tell.** the LEFT
1820: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63   OUTER JOIN proc
1830: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61  essing logic tha
1840: 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  t this term is p
1850: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f  art of the.** jo
1860: 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  in restriction s
1870: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
1880: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1890: 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72  se and not a par
18a0: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65  t.** of the more
18b0: 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63   general WHERE c
18c0: 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65  lause.  These te
18d0: 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76  rms are moved ov
18e0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  er to the.** WHE
18f0: 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67  RE clause during
1900: 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67   join processing
1910: 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   but we need to 
1920: 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  remember that th
1930: 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64  ey.** originated
1940: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
1950: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
1960: 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68  * The Expr.iRigh
1970: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73  tJoinTable tells
1980: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1990: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  e processing tha
19a0: 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  t the.** express
19b0: 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ion depends on t
19c0: 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54  able iRightJoinT
19d0: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61  able even if tha
19e0: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a  t table is not.*
19f0: 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e  * explicitly men
1a00: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78  tioned in the ex
1a10: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20  pression.  That 
1a20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
1a30: 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73  eeded.** for cas
1a40: 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  es like this:.**
1a50: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
1a60: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1a70: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1a80: 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a  b AND t1.x=5.**.
1a90: 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61  ** The where cla
1aa0: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66  use needs to def
1ab0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
1ac0: 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a  of the t1.x=5.**
1ad0: 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65   term until afte
1ae0: 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66  r the t2 loop of
1af0: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74   the join.  In t
1b00: 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55  hat way, a.** NU
1b10: 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62  LL t2 row will b
1b20: 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65  e inserted whene
1b30: 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66  ver t1.x!=5.  If
1b40: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65   we do not.** de
1b50: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
1b60: 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77   of t1.x=5, it w
1b70: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
1b80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
1b90: 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f  after the t1 loo
1ba0: 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20  p and rows with 
1bb0: 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76  t1.x!=5 will nev
1bc0: 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  er appear in.** 
1bd0: 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63  the output, whic
1be0: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
1bf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c00: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
1c10: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
1c20: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1c30: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c40: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
1c50: 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  n);.    p->iRigh
1c60: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61  tJoinTable = iTa
1c70: 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e  ble;.    setJoin
1c80: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
1c90: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
1ca0: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1cc0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1cd0: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1ce0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1cf0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1d00: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1d10: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
1d20: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
1d30: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
1d40: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
1d50: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
1d60: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
1d70: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1d80: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
1d90: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1da0: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
1db0: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
1dc0: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
1dd0: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
1de0: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
1df0: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
1e00: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
1e10: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
1e20: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
1e30: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
1e40: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
1e50: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
1e60: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
1e70: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
1e80: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
1e90: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
1ea0: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
1eb0: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
1ec0: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
1ed0: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
1ee0: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
1ef0: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
1f00: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
1f10: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
1f20: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f30: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f40: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
1f50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f60: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
1f70: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
1f80: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
1f90: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
1fc0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1fd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2000: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
2010: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2020: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
2030: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
2040: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
2050: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2060: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
2070: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
2080: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
2090: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
20a0: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
20b0: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
20c0: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
20d0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
20e0: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
20f0: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
2100: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
2110: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
2120: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
2130: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
2140: 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28  ->pTab;..    if(
2150: 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20   pLeftTab==0 || 
2160: 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63  pRightTab==0 ) c
2170: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2180: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
2190: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
21a0: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
21b0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
21c0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
21d0: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
21e0: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
21f0: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
2200: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6a      if( pLeft->j
2210: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2220: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2230: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20  ( pLeft->pOn || 
2240: 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b  pLeft->pUsing ){
2250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2260: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2270: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2280: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2290: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
22a0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22b0: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
22c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
22d0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
22e0: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
22f0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
2300: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
2310: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
2320: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2330: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2340: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
2350: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2360: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
2370: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2380: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
23b0: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
23c0: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
23f0: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
2400: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  re);.          .
2410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2420: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2430: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2440: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2450: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2460: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2470: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26 26  f( pLeft->pOn &&
2480: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
2490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
24a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
24b0: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
24c0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
24d0: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
24e0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
24f0: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2500: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2510: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2520: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2530: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2540: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2550: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
2560: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
2570: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2580: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  >pOn ){.      se
2590: 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74 2d  tJoinExpr(pLeft-
25a0: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
25b0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
25c0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
25d0: 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
25e0: 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b  re, pLeft->pOn);
25f0: 0a 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 4f  .      pLeft->pO
2600: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2610: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2620: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2630: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2640: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2650: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2660: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2670: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2680: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
2690: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
26a0: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
26b0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
26c0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
26d0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
26e0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
26f0: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2700: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2710: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2720: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2730: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2740: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2750: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2760: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2770: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
2780: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
2790: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
27a0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 55     if( pLeft->pU
27b0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64  sing ){.      Id
27c0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 4c  List *pList = pL
27d0: 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  eft->pUsing;.   
27e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
27f0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
2800: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2810: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
2820: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2830: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
2840: 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65  (pLeftTab, zName
2850: 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64  )<0 || columnInd
2860: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2870: 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ame)<0 ){.      
2880: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2890: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
28a0: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
28b0: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
28c0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
28d0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
28e0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
28f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2900: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2910: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
2920: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
2930: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2940: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2970: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
29a0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
29b0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
29c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
29d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
29e0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
29f0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
2a00: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
2a10: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
2a20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a30: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 65  3SelectDelete(Se
2a40: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
2a50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
2a60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a70: 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69 73 74  Delete(p->pEList
2a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
2a90: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 72  istDelete(p->pSr
2aa0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  c);.  sqlite3Exp
2ab0: 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68 65 72  rDelete(p->pWher
2ac0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
2ad0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
2ae0: 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69  GroupBy);.  sqli
2af0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
2b00: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c  >pHaving);.  sql
2b10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2b20: 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(p->pOrderBy);
2b30: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2b40: 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69 6f 72  Delete(p->pPrior
2b50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2b60: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
2b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2b80: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 66 66 73 65  Delete(p->pOffse
2b90: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
2ba0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  (p);.}../*.** In
2bb0: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
2bc0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
2bd0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
2be0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
2bf0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
2c00: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
2c10: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
2c20: 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a 70 50  Sorter(Parse *pP
2c30: 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c 20 45  arse, Vdbe *v, E
2c40: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
2c50: 79 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y){.  sqlite3Exp
2c60: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2c70: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
2c80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2c90: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  dOp(v, OP_Sequen
2ca0: 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  ce, pOrderBy->iE
2cb0: 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71  Cursor, 0);.  sq
2cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2cd0: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65  , OP_Pull, pOrde
2ce0: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
2cf0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2d00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
2d10: 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42  eRecord, pOrderB
2d20: 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30 29  y->nExpr + 2, 0)
2d30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2d40: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
2d50: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
2d60: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 7d 0a  iECursor, 0);.}.
2d70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
2d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2d90: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
2da0: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
2db0: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
2dc0: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
2dd0: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
2de0: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
2df0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
2e00: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2e10: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
2e20: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
2e30: 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue,    /* Jump h
2e40: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
2e50: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
2e60: 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20 20  /.  int nPop    
2e70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e80: 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70 20  of times to pop 
2e90: 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70 69  stack when jumpi
2ea0: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ng */.){.  if( p
2eb0: 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26 20  ->iOffset>=0 && 
2ec0: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a  iContinue!=0 ){.
2ed0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
2ee0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2ef0: 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20  tAddr(v) + 3;.  
2f00: 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20 61    if( nPop>0 ) a
2f10: 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  ddr++;.    sqlit
2f20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2f30: 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4f  P_MemIncr, p->iO
2f40: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
2f50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2f60: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
2f70: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
2f80: 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e  );.    if( nPop>
2f90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2fa0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2fb0: 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29 3b  P_Pop, nPop, 0);
2fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2fd0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2fe0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
2ff0: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3000: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b  omment((v, "# sk
3010: 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64  ip OFFSET record
3020: 73 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  s"));.  }.}../*.
3030: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3040: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3050: 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 6f 70  ake sure the top
3060: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
3070: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61 72 65 20  he.** stack are 
3080: 64 69 73 74 69 6e 63 74 2e 20 20 69 54 61 62 20  distinct.  iTab 
3090: 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  is a sorting ind
30a0: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72  ex that holds pr
30b0: 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e  eviously.** seen
30c0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
30d0: 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20   the N values.  
30e0: 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d  A new entry is m
30f0: 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69  ade in iTab.** i
3100: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20  f the current N 
3110: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a  values are new..
3120: 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20  **.** A jump to 
3130: 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61  addrRepeat is ma
3140: 64 65 20 61 6e 64 20 74 68 65 20 4b 20 76 61 6c  de and the K val
3150: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
3160: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
3170: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
3180: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
3190: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
31a0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
31b0: 69 6e 63 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  inct(.  Vdbe *v,
31c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
31d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
31e0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
31f0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
3200: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
3210: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
3220: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
3230: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
3240: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
3250: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
3260: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
3270: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
3280: 20 20 2f 2a 20 54 68 65 20 74 6f 70 20 4e 20 65    /* The top N e
3290: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
32a0: 74 61 63 6b 20 6d 75 73 74 20 62 65 20 64 69 73  tack must be dis
32b0: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4b  tinct */.  int K
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32d0: 20 50 6f 70 20 4b 20 65 6c 65 6d 65 6e 74 73 20   Pop K elements 
32e0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 69  from the stack i
32f0: 66 20 69 6e 64 69 73 74 69 6e 63 74 20 2a 2f 0a  f indistinct */.
3300: 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41  ){.#if NULL_ALWA
3310: 59 53 5f 44 49 53 54 49 4e 43 54 0a 20 20 73 71  YS_DISTINCT.  sq
3320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3330: 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 2d 4e 2c  , OP_IsNull, -N,
3340: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
3350: 65 6e 74 41 64 64 72 28 76 29 2b 36 29 3b 0a 23  entAddr(v)+6);.#
3360: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
3370: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3380: 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30  akeRecord, -N, 0
3390: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
33a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
33b0: 69 6e 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69  inct, iTab, sqli
33c0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
33d0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69  dr(v)+3);.  sqli
33e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
33f0: 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30 29 3b 0a 20  OP_Pop, K, 0);. 
3400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3410: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3420: 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20   addrRepeat);.  
3430: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
3440: 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e  "# skip indistin
3450: 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ct records"));. 
3460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3470: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
3480: 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a  t, iTab, 0);.}..
3490: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
34a0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
34b0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
34c0: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
34d0: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
34e0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
34f0: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
3500: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
3510: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
3520: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
3530: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
3540: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
3550: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
3560: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
3570: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
3580: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
3590: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
35a0: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
35b0: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
35c0: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
35d0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
35e0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e  ic int selectInn
35f0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
3600: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3610: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
3620: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
3630: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
3640: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
3650: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
3660: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3670: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
3680: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
3690: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
36a0: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
36b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
36c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
36d0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
36e0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
36f0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
3700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3710: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
3720: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
3730: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3740: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
3750: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
3760: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
3770: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
3780: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
3790: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
37a0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
37b0: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
37c0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37e0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
37f0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
3800: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3820: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
3830: 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  e disposal metho
3840: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3850: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
3860: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
3870: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
3880: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
3890: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20  Break,          
38a0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
38b0: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
38c0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
38d0: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
38f0: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
3900: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
3910: 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  nion */.){.  Vdb
3920: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3930: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
3940: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
3950: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
3960: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
3970: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
3980: 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  ent */..  if( v=
3990: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
39a0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
39b0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
39c0: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
39d0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
39e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
39f0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
3a00: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
3a10: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
3a20: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
3a30: 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  /.  hasDistinct 
3a40: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26  = distinct>=0 &&
3a50: 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
3a60: 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66  t->nExpr>0;.  if
3a70: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
3a80: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
3a90: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
3aa0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
3ab0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3ac0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3ad0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
3ae0: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
3af0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3b00: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
3b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3b20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
3b30: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3b50: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
3b60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3b70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3b80: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3b90: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
3ba0: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3bb0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3bc0: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3bd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3be0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3bf0: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3c00: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3c10: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3c20: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3c30: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3c40: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3c50: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  ct ){.    int n 
3c60: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
3c70: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
3c80: 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  t(v, distinct, i
3c90: 43 6f 6e 74 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31  Continue, n, n+1
3ca0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  );.    if( pOrde
3cb0: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
3cc0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
3cd0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
3ce0: 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  umn);.    }.  }.
3cf0: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3d00: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3d10: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3d20: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3d30: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3d40: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3d50: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3d60: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
3d70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
3d80: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
3d90: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
3da0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
3dc0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
3dd0: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
3de0: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
3df0: 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20   if( aff ){.    
3e00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
3e10: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
3e20: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
3e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3e50: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
3e60: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
3e70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3e80: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
3e90: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
3ea0: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
3eb0: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
3ec0: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
3ed0: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
3ee0: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
3ef0: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
3f00: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
3f10: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
3f20: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
3f30: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
3f40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
3f50: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
3f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3f70: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3f80: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
3f90: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
3fa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3fb0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3fc0: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
3fd0: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
3fe0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3ff0: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
4000: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
4010: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4020: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
4030: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4040: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4050: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
4060: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
4070: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
4080: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
4090: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
40a0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
40b0: 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20 7b 0a  T_VirtualTab: {.
40c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
40d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
40e0: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
40f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4100: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4110: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4120: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4130: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4150: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4160: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
4170: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
4180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4190: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
41a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
41b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
41c0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
41d0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rm, 0);.      }.
41e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
41f0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
4200: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4210: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
4220: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
4230: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
4240: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
4250: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
4260: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
4270: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
4280: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
4290: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
42a0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
42b0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
42c0: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
42d0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
42e0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
42f0: 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  nt addr1 = sqlit
4300: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4310: 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  r(v);.      int 
4320: 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73  addr2;..      as
4330: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4340: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4350: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4360: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
4370: 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  dr1+3);.      sq
4380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4390: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
43a0: 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73  .      addr2 = s
43b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
43c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
43d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
43e0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
43f0: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
4400: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
4410: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
4420: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
4430: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
4440: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
4450: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
4460: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4470: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
4480: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
4490: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
44a0: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
44b0: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
44c0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
44d0: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
44e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
44f0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4500: 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42  arse, v, pOrderB
4510: 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
4520: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
4530: 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26  f = (iParm>>16)&
4540: 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66  0xFF;.        af
4550: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
4560: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
4570: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61  t->a[0].pExpr, a
4580: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ff);.        sql
4590: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
45a0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
45b0: 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20   0, &aff, 1);.  
45c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
45d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
45e0: 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30  Insert, (iParm&0
45f0: 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a  x0000FFFF), 0);.
4600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4610: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4620: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  e(v, addr2);.   
4630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4640: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
4650: 6f 77 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ow exists in the
4660: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
4670: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
4680: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
4690: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
46a0: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
46b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
46c0: 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
46d0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Parm);.      sql
46e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
46f0: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
4700: 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 0);.      /* T
4710: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
4720: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
4730: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
4740: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
4750: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4760: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
4770: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
4780: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
4790: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
47a0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
47b0: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
47c0: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
47d0: 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75  ell and break ou
47e0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
47f0: 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
4800: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  /.    case SRT_M
4810: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4820: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4830: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4840: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4850: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4860: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
4870: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
4880: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4890: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
48a0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
48b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
48c0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
48d0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
48e0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
48f0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
4900: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4910: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
4920: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4930: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
4940: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
4950: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
4960: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
4970: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
4980: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
4990: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
49a0: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
49b0: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
49c0: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
49d0: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
49e0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
49f0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
4a00: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
4a10: 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ne:.    case SRT
4a20: 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20  _Callback: {.   
4a30: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4a40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4a50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a60: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
4a70: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4a80: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4a90: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4aa0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4ab0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
4ac0: 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b  RT_Subroutine ){
4ad0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4ae0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4af0: 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29  Gosub, 0, iParm)
4b00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4b20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61  beAddOp(v, OP_Ca
4b30: 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c  llback, nColumn,
4b40: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4b50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4b60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4b70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
4b80: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
4b90: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
4ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
4bb0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4bc0: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
4bd0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
4be0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
4bf0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
4c00: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
4c10: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
4c20: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
4c30: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
4c40: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
4c50: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
4c60: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
4c70: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
4c80: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
4c90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4ca0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
4cb0: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
4cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4cd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
4ce0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4d00: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
4d10: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
4d20: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
4d30: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
4d40: 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
4d50: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26  ( p->iLimit>=0 &
4d60: 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
4d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4d80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
4d90: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
4da0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
4db0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4dc0: 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  fMemZero, p->iLi
4dd0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
4de0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4df0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
4e00: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
4e10: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
4e20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
4e30: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
4e40: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
4e50: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
4e60: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
4e70: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
4e80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
4e90: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
4ea0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
4eb0: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
4ec0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
4ed0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4ee0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
4ef0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
4f00: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
4f10: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
4f20: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
4f30: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
4f40: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
4f50: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
4f60: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
4f70: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
4f80: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
4f90: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
4fa0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
4fb0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
4fc0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
4fd0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
4fe0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
4ff0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
5000: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
5010: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5020: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
5030: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
5040: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
5050: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
5060: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
5070: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
5080: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
5090: 33 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  3 field of an op
50a0: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33  code using.** P3
50b0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
50c0: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
50d0: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
50e0: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
50f0: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
5100: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
5110: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
5120: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
5130: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5140: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
5150: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
5160: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
5170: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
5180: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
5190: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
51a0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
51b0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
51c0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  oc( sizeof(*pInf
51d0: 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65  o) + nExpr*(size
51e0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20  of(CollSeq*)+1) 
51f0: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
5200: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f  {.    pInfo->aSo
5210: 72 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a  rtOrder = (char*
5220: 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  )&pInfo->aColl[n
5230: 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66 6f  Expr];.    pInfo
5240: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72  ->nField = nExpr
5250: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63  ;.    pInfo->enc
5260: 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20   = db->enc;.    
5270: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
5280: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
5290: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
52a0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
52b0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
52c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
52d0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
52e0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
52f0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
5300: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
5310: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
5320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5330: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
5340: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
5350: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
5360: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
5370: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
5380: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
5390: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
53a0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
53b0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
53c0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
53d0: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
53e0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
53f0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
5400: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
5410: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
5420: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
5430: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
5440: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
5450: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
5460: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
5470: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
5480: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
5490: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
54a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
54b0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
54c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
54d0: 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69  ,   /* The parsi
54e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
54f0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
5500: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
5510: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
5520: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f  be *v,         /
5530: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
5540: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
5550: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
5560: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5570: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
5580: 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  a */.  int eDest
5590: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
55a0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
55b0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  lts here */.  in
55c0: 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f  t iParm        /
55d0: 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d  * Optional param
55e0: 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  eter associated 
55f0: 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b  with eDest */.){
5600: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
5610: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
5620: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
5630: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
5640: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
5650: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
5660: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
5670: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
5680: 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20  rderBy;..  iTab 
5690: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
56a0: 72 73 6f 72 3b 0a 20 20 61 64 64 72 20 3d 20 31  rsor;.  addr = 1
56b0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
56c0: 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  dOp(v, OP_Sort, 
56d0: 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f  iTab, brk);.  co
56e0: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63  deOffset(v, p, c
56f0: 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ont, 0);.  sqlit
5700: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5710: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
5720: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
5730: 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20  + 1);.  switch( 
5740: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
5750: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
5760: 20 63 61 73 65 20 53 52 54 5f 56 69 72 74 75 61   case SRT_Virtua
5770: 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  lTab: {.      sq
5780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5790: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
57a0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
57b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57c0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
57d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
57e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
57f0: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
5800: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5810: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
5820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5830: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
5840: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
5850: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
5860: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5870: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5880: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
5890: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
58a0: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
58b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58c0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
58d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
58e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
58f0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
5900: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5910: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
5920: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
5930: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5940: 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53 54  1, 0, "n", P3_ST
5950: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
5960: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5970: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
5980: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
5990: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  ), 0);.      bre
59a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
59b0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
59c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
59d0: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
59e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
59f0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
5a00: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
5a10: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5a20: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
5a30: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
5a40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
5a50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5a60: 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  f.    case SRT_C
5a70: 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63 61 73  allback:.    cas
5a80: 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  e SRT_Subroutine
5a90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
5aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5ab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
5ac0: 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69 73 74  teger, p->pEList
5ad0: 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->nExpr, 0);.   
5ae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5af0: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
5b00: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  1, 0);.      for
5b10: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
5b20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
5b30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5b40: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31  v, OP_Column, -1
5b50: 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  -i, i);.      }.
5b60: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
5b70: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
5b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5b90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5ba0: 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d  Callback, nColum
5bb0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n, 0);.      }el
5bc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5be0: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
5bf0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
5c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5c10: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32  dOp(v, OP_Pop, 2
5c20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5c30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
5c40: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
5c50: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
5c60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c70: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
5c80: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5c90: 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65  he loop when the
5ca0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
5cb0: 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  d.  */.  if( p->
5cc0: 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20  iLimit>=0 ){.   
5cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ce0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
5cf0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a   p->iLimit, 0);.
5d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5d10: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
5d20: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
5d30: 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   brk);.  }..  /*
5d40: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
5d50: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
5d60: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
5d70: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
5d80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5d90: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
5da0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73  iTab, addr);.  s
5db0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
5dc0: 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a  eLabel(v, brk);.
5dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5de0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
5df0: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
5e00: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
5e10: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
5e20: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
5e30: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
5e40: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
5e50: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
5e60: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aller..**.** If 
5e70: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
5e80: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
5e90: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
5ea0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
5eb0: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67  from.** the orig
5ec0: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
5ed0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
5ee0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
5ef0: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a   a column..** .*
5f00: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
5f10: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78  n type for an ex
5f20: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68  pression is eith
5f30: 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43  er TEXT, NUMERIC
5f40: 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20   or ANY..** The 
5f50: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5f60: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
5f70: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a  ld is INTEGER..*
5f80: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
5f90: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
5fa0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
5fb0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5fc0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
5fd0: 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  ype;.  int j;.  
5fe0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
5ff0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
6000: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6010: 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65  /* The TK_AS ope
6020: 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f  rator can only o
6030: 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59  ccur in ORDER BY
6040: 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49  , GROUP BY, HAVI
6050: 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d  NG,.  ** and LIM
6060: 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74  IT clauses.  But
6070: 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65   pExpr originate
6080: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
6090: 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45  set of a.  ** SE
60a0: 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20  LECT.  So pExpr 
60b0: 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  can never contai
60c0: 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72  n an AS operator
60d0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
60e0: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
60f0: 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  S );..  switch( 
6100: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
6110: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
6120: 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a   {.      Table *
6130: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
6140: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
6150: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6160: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
6170: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
6180: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
6190: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
61a0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
61b0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
61c0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
61d0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
61e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
61f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
6200: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6210: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
6220: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6230: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
6240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6250: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
6260: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
6270: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6280: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
6290: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20     /* FIX ME:.  
62a0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
62b0: 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20  n occurs if you 
62c0: 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c  have something l
62d0: 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e  ike "SELECT new.
62e0: 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20  x;" inside.     
62f0: 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e     ** a trigger.
6300: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6310: 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e  , if you referen
6320: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  ce the special "
6330: 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  new".        ** 
6340: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73  table in the res
6350: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c  ult set of a sel
6360: 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ect.  We do not 
6370: 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a  have a good way.
6380: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69          ** to fi
6390: 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  nd the actual ta
63a0: 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c  ble type, so cal
63b0: 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68  l it "TEXT".  Th
63c0: 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20  is is really.   
63d0: 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e       ** somethin
63e0: 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20  g of a bug, but 
63f0: 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  I do not know ho
6400: 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20  w to fix it..   
6410: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
6420: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65  ** This code doe
6430: 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68  s not produce th
6440: 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
6450: 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65   - it just preve
6460: 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nts.        ** a
6470: 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20   segfault.  See 
6480: 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20  ticket #1229..  
6490: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
64a0: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
64b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
64c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
64d0: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
64e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
64f0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
6500: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
6510: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
6520: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
6530: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
6540: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
6550: 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  ){.        zType
6560: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
6570: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6580: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
6590: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
65a0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
65b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
65c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
65d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
65e0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
65f0: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
6600: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
6610: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
6620: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
6630: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6640: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
6650: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
6660: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
6670: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
6680: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e  nType(&sNC, pS->
6690: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
66a0: 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  pr); .      brea
66b0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
66c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
66d0: 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20     zType = 0;.  
66e0: 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54  }.  .  return zT
66f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
6700: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
6710: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
6720: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
6730: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
6740: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
6750: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
6760: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
6770: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
6780: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6790: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
67a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
67b0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
67c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
67d0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
67e0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
67f0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
6800: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
6810: 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
6820: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6830: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
6840: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
6850: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
6860: 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28  pTabList;.  for(
6870: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
6880: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
6890: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
68a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
68b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
68c0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
68d0: 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69  (&sNC, p);.    i
68e0: 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f  f( zType==0 ) co
68f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54  ntinue;.    /* T
6900: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
6910: 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20  e it's own copy 
6920: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79  of the column-ty
6930: 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  pe, in case the 
6940: 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69  .    ** schema i
6950: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
6960: 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
6970: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
6980: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
6990: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
69a0: 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45  (v, i+pEList->nE
69b0: 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c  xpr, zType, strl
69c0: 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a  en(zType));.  }.
69d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
69e0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
69f0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
6a00: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
6a10: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
6a20: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
6a30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
6a40: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
6a50: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
6a60: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
6a70: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
6a80: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
6a90: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
6aa0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6ab0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6ac0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
6ad0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
6ae0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
6af0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6b00: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
6b10: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
6b20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
6b30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6b40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6b50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
6b60: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6b70: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
6b80: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
6b90: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
6ba0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
6bb0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6bc0: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
6bd0: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
6be0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
6bf0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
6c00: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
6c10: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
6c20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
6c30: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
6c40: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61  =0 || sqlite3_ma
6c50: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65  lloc_failed ) re
6c60: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
6c70: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
6c80: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
6c90: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6ca0: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
6cb0: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
6cc0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6cd0: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
6ce0: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
6cf0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
6d00: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
6d10: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
6d20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
6d30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
6d40: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
6d50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
6d60: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
6d70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
6d80: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
6d90: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
6da0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
6db0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
6dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6dd0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
6de0: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
6df0: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63  zName));.      c
6e00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
6e10: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
6e20: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c  _COLUMN && pTabL
6e30: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
6e40: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
6e50: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
6e60: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
6e70: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
6e80: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69  or(j=0; j<pTabLi
6e90: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
6ea0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
6eb0: 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a  or!=p->iTable; j
6ec0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
6ed0: 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  rt( j<pTabList->
6ee0: 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54  nSrc );.      pT
6ef0: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
6f00: 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20  [j].pTab;.      
6f10: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
6f20: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
6f30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
6f40: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
6f50: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
6f60: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
6f70: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
6f80: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
6f90: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
6fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
6fb0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
6fc0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
6fd0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
6fe0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
6ff0: 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61  lNames && p->spa
7000: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
7010: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  [0] ){.        s
7020: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
7030: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
7040: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
7050: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7060: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
7070: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
7080: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
7090: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
70a0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
70b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
70c0: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
70d0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
70e0: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
70f0: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
7100: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
7110: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
7120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7130: 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c  etString(&zName,
7140: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
7150: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
7160: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7170: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
7180: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
7190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
71a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
71b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
71c0: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
71d0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
71e0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
71f0: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
7200: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
7210: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7220: 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e  me(v, i, p->span
7230: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
7240: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
7250: 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63  VdbeCompressSpac
7260: 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20  e(v, addr); */. 
7270: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7280: 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a  char zName[30];.
7290: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
72a0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
72b0: 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b  | pTabList==0 );
72c0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
72d0: 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  Name, "column%d"
72e0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  , i+1);.      sq
72f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7300: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
7310: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
7320: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
7330: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
7340: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
7350: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7360: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7370: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
7380: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
7390: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
73a0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
73b0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
73c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
73d0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
73e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
73f0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
7400: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
7410: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
7420: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
7430: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
7440: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
7450: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
7460: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
7470: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
7480: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
7490: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
74a0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
74b0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
74c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
74d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
74e0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
74f0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
7500: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
7510: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
7520: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
7530: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
7540: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
7550: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
7560: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
7570: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
7580: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
7590: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
75a0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
75b0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
75c0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
75d0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
75e0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
75f0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
7600: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
7610: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
7620: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
7630: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
7640: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
7650: 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53   if( prepSelectS
7660: 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  tmt(pParse, pSel
7670: 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ect) ){.    retu
7680: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
7690: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
76a0: 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65  olve(pParse, pSe
76b0: 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20  lect, 0) ){.    
76c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
76d0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pTab = sqliteMal
76e0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c  loc( sizeof(Tabl
76f0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
7700: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
7710: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  n 0;.  }.  pTab-
7720: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
7730: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e  b->zName = zTabN
7740: 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44  ame ? sqliteStrD
7750: 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30  up(zTabName) : 0
7760: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  ;.  pEList = pSe
7770: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
7780: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c  pTab->nCol = pEL
7790: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73  ist->nExpr;.  as
77a0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
77b0: 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43  >0 );.  pTab->aC
77c0: 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69  ol = aCol = sqli
77d0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
77e0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a  (pTab->aCol[0])*
77f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
7800: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
7810: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
7820: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
7830: 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52      Expr *p, *pR
7840: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
7850: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  e;.    char *zNa
7860: 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42  me;.    char *zB
7870: 61 73 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  asename;.    int
7880: 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f   cnt;.    NameCo
7890: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a  ntext sNC;.    .
78a0: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
78b0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
78c0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
78d0: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c    */.    p = pEL
78e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
78f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
7900: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e  pRight==0 || p->
7910: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d  pRight->token.z=
7920: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
7930: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29  >token.z[0]!=0 )
7940: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
7950: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
7960: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
7970: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
7980: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
7990: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
79a0: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
79b0: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
79c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
79d0: 74 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b  teStrDup(zName);
79e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
79f0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20  ->op==TK_DOT .  
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
7a10: 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30  pR=p->pRight)!=0
7a20: 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20   && pR->token.z 
7a30: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pR->token.z[0
7a40: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  ] ){.      /* Fo
7a50: 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  r columns of the
7a60: 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20   from A.B use B 
7a70: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
7a80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
7a90: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22  ite3MPrintf("%T"
7aa0: 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  , &pR->token);. 
7ab0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
7ac0: 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61  span.z && p->spa
7ad0: 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  n.z[0] ){.      
7ae0: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
7af0: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
7b00: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
7b10: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
7b20: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
7b30: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
7b40: 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20  T", &p->span);. 
7b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b60: 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66  /* If all else f
7b70: 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20  ails, make up a 
7b80: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
7b90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
7ba0: 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c  intf("column%d",
7bb0: 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   i+1);.    }.   
7bc0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
7bd0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
7be0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
7bf0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
7c00: 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29  qliteFree(zName)
7c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
7c20: 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54  eleteTable(0, pT
7c30: 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ab);.      retur
7c40: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 0;.    }..    
7c50: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
7c60: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
7c70: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
7c80: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
7c90: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
7ca0: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
7cb0: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
7cc0: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
7cd0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 42  e..    */.    zB
7ce0: 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  asename = zName;
7cf0: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
7d00: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
7d10: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
7d20: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
7d30: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
7d40: 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  {.        zName 
7d50: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7d60: 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73 65 6e  ("%s:%d", zBasen
7d70: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
7d80: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
7d90: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
7da0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
7db0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
7dc0: 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d   zBasename!=zNam
7dd0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
7de0: 65 46 72 65 65 28 7a 42 61 73 65 6e 61 6d 65 29  eFree(zBasename)
7df0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
7e00: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
7e10: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
7e20: 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20   typename, type 
7e30: 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f  affinity, and co
7e40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7e50: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
7e60: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
7e70: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
7e80: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
7e90: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
7ea0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
7eb0: 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73  c;.    zType = s
7ec0: 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75  qliteStrDup(colu
7ed0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 29 29  mnType(&sNC, p))
7ee0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  ;.    pCol->zTyp
7ef0: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
7f00: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
7f10: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
7f20: 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c  ity(p);.    pCol
7f30: 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
7f40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7f50: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
7f60: 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b   !pCol->pColl ){
7f70: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f  .      pCol->pCo
7f80: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
7f90: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
7fa0: 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50  }.  }.  pTab->iP
7fb0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  Key = -1;.  retu
7fc0: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
7fd0: 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45  * Prepare a SELE
7fe0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
7ff0: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64   processing by d
8000: 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  oing the followi
8010: 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a  ng.** things:.**
8020: 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
8030: 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
8040: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
8050: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
8060: 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
8070: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
8080: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
8090: 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
80a0: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
80b0: 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
80c0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
80d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
80e0: 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
80f0: 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
8100: 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
8110: 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
8120: 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
8130: 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
8140: 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
8150: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
8160: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
8170: 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
8180: 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
8190: 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
81a0: 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
81b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
81c0: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
81d0: 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
81e0: 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
81f0: 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
8200: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
8210: 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
8220: 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
8230: 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
8240: 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
8250: 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
8260: 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
8270: 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
8280: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
8290: 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
82a0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
82b0: 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
82c0: 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
82d0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
82e0: 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
82f0: 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
8300: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
8310: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8320: 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
8330: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
8340: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
8350: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
8360: 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
8370: 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
8380: 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
8390: 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
83a0: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
83b0: 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
83c0: 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
83d0: 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
83e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
83f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
8400: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
8410: 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c   there are probl
8420: 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  ems, leave an er
8430: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
8440: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
8450: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70  .static int prep
8470: 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65  SelectStmt(Parse
8480: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
8490: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
84a0: 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69  , k, rc;.  SrcLi
84b0: 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
84c0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
84d0: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
84e0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
84f0: 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
8500: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d    if( p==0 || p-
8510: 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >pSrc==0 || sqli
8520: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
8530: 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
8540: 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
8550: 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
8560: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
8570: 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
8580: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
8590: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
85a0: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
85b0: 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
85c0: 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
85d0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
85e0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
85f0: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
8600: 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b  Parse, p->pSrc);
8610: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
8620: 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
8630: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
8640: 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
8650: 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
8660: 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
8670: 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
8680: 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
8690: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
86a0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
86b0: 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
86c0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
86d0: 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
86e0: 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
86f0: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
8700: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
8710: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
8720: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
8730: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
8740: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
8750: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
8760: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
8770: 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
8780: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
8790: 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
87a0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
87b0: 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
87c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
87d0: 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
87e0: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
87f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8800: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
8810: 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
8820: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8830: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
8840: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8850: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
8860: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
8870: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20  From->zAlias==0 
8880: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  ){.        pFrom
8890: 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20  ->zAlias =.     
88a0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
88b0: 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71  ntf("sqlite_subq
88c0: 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64  uery_%p_", (void
88d0: 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  *)pFrom->pSelect
88e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
88f0: 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
8900: 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
8910: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
8920: 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
8930: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
8940: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
8950: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70  pFrom->zAlias, p
8960: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
8970: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
8980: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
8990: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
89a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72       /* The isTr
89b0: 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64  ansient flag ind
89c0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
89d0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
89e0: 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a  has been.      *
89f0: 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  * dynamically al
8a00: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20  located and may 
8a10: 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20  be freed at any 
8a20: 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20  time.  In other 
8a30: 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20  words,.      ** 
8a40: 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e  pTab is not poin
8a50: 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73  ting to a persis
8a60: 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  tent table struc
8a70: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
8a80: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20  s.      ** part 
8a90: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a  of the schema. *
8aa0: 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73  /.      pTab->is
8ab0: 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23  Transient = 1;.#
8ac0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
8ad0: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
8ae0: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
8af0: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
8b00: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
8b10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
8b20: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
8b30: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
8b40: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
8b50: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
8b60: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72  Table(pParse,pFr
8b70: 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
8b80: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
8b90: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
8ba0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8bb0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8bc0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
8bd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8be0: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69  MIT_VIEW.      i
8bf0: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
8c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
8c10: 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
8c20: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
8c30: 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
8c40: 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
8c50: 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
8c60: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
8c70: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
8c80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
8c90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8ca0: 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e     /* If pFrom->
8cb0: 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65  pSelect!=0 it me
8cc0: 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
8cd0: 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20  ng with a.      
8ce0: 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e    ** view within
8cf0: 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45   a view.  The SE
8d00: 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68  LECT structure h
8d10: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
8d20: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
8d30: 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76  d by the outer v
8d40: 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b  iew so we can sk
8d50: 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70  ip the copy step
8d60: 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   here.        **
8d70: 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69   in the inner vi
8d80: 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
8d90: 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d         if( pFrom
8da0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
8db0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d            pFrom-
8dc0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
8dd0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62  e3SelectDup(pTab
8de0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
8df0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
8e00: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
8e10: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
8e20: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
8e30: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
8e40: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
8e50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
8e60: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
8e70: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
8e80: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
8e90: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
8ea0: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
8eb0: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
8ec0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
8ed0: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
8ee0: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
8ef0: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
8f00: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
8f10: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
8f20: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
8f30: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
8f40: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
8f50: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
8f60: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
8f70: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
8f80: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
8f90: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
8fa0: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
8fb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
8fc0: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
8fd0: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
8fe0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
8ff0: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
9000: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
9010: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
9020: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
9030: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
9040: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
9050: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
9060: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
9070: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
9080: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
9090: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
90a0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
90b0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
90c0: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
90d0: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
90e0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
90f0: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
9100: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
9110: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
9120: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
9130: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
9140: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
9150: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
9160: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
9170: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
9180: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
9190: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
91a0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
91b0: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
91c0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
91d0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
91e0: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
91f0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
9200: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
9210: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
9220: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
9230: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
9240: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
9250: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
9260: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
9270: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
9280: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
9290: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
92a0: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
92b0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
92c0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
92d0: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
92e0: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
92f0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
9300: 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20  mes)!=0 &&.     
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
9330: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
9340: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
9350: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
9360: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
9370: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
9380: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
9390: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
93a0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
93b0: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
93c0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
93d0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
93e0: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
93f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
9400: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
9410: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
9420: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
9430: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9440: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
9450: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
9460: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
9470: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , 0);.        pN
9480: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
9490: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
94a0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
94b0: 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
94c0: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
94d0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
94e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
94f0: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
9500: 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
9510: 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
9520: 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
9530: 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
9540: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
9550: 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
9560: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
9570: 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
9580: 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
9590: 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
95a0: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
95b0: 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
95c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
95d0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
95e0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
95f0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
9600: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9610: 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74  en(&pE->pLeft->t
9620: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  oken);.        }
9630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9640: 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
9650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
9660: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
9670: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
9680: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
9690: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
96a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
96b0: 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
96c0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
96d0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
96e0: 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
96f0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
9700: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
9710: 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20  0]==0 ){ .      
9720: 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
9730: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
9740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9750: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
9760: 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  & (zTabName==0 |
9770: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
9780: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
9790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
97a0: 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
97b0: 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20  bName)!=0) ){.  
97c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
97d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
97e0: 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
97f0: 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
9800: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
9810: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
9820: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
9830: 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c   *pExpr, *pLeft,
9840: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
9850: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
9860: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
9870: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
9880: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
9890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
98a0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
98b0: 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
98c0: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
98e0: 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70   (pLeft->jointyp
98f0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
9900: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
9920: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
9930: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
9940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9950: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
9960: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
9970: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
9980: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
9990: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
99a0: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
99b0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
99c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
99d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
99e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
99f0: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
9a00: 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c  x(pLeft->pUsing,
9a10: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a30: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
9a40: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
9a50: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
9a60: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
9a70: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
9a80: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
9a90: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
9aa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
9ab0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9ad0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9ae0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
9af0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
9b00: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
9b10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
9b20: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
9b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
9b40: 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74  Token(&pRight->t
9b50: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
9b60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
9b70: 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e  abName && (longN
9b80: 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
9b90: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
9ba0: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
9bb0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
9bc0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9be0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9bf0: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
9c00: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
9c10: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
9c20: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
9c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
9c40: 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e  etToken(&pLeft->
9c50: 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
9c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9c70: 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
9c80: 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50  >span, sqlite3MP
9c90: 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a  rintf("%s.%s", z
9ca0: 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29  TabName, zName))
9cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9cc0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
9cd0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
9ce0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
9cf0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
9d00: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
9d10: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
9d20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
9d30: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
9d40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9d60: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9d80: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
9d90: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9da0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9db0: 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
9dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9dd0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
9de0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
9df0: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70  ew, pExpr, &pExp
9e00: 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  r->span);.      
9e10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9e20: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
9e30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9e40: 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45  tAppend(pNew, pE
9e50: 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  xpr, &pRight->to
9e60: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
9e70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
9e80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9e90: 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
9ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9eb0: 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
9ec0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9ed0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9ee0: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
9ef0: 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
9f00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9f20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9f30: 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
9f40: 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
9f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9f60: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
9f70: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
9f80: 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20  eFree(zTName);. 
9f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9fa0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9fb0: 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a  Delete(pEList);.
9fc0: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
9fd0: 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
9fe0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
9ff0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
a000: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
a010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a020: 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72   associates entr
a030: 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  ies in an ORDER 
a040: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  BY expression li
a050: 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d  st with.** colum
a060: 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20  ns in a result. 
a070: 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20   For each ORDER 
a080: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  BY expression, t
a090: 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20  he opcode of.** 
a0a0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f  the top-level no
a0b0: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
a0c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74   TK_COLUMN and t
a0d0: 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  he iColumn value
a0e0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
a0f0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
a100: 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75  led in with colu
a110: 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  mn number and th
a120: 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75  e iTable.** valu
a130: 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  e of the top-lev
a140: 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65  el node is fille
a150: 64 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61  d with iTable pa
a160: 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  rameter..**.** I
a170: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f  f there are prio
a180: 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73  r SELECT clauses
a190: 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65  , they are proce
a1a0: 73 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d  ssed first.  A m
a1b0: 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61  atch.** in an ea
a1c0: 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b  rlier SELECT tak
a1d0: 65 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76  es precedence ov
a1e0: 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43  er a later SELEC
a1f0: 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74  T..**.** Any ent
a200: 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ry that does not
a210: 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65   match is flagge
a220: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  d as an error.  
a230: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
a240: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
a250: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
a260: 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  nt matchOrderbyT
a270: 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  oColumn(.  Parse
a280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
a290: 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f     /* A place to
a2a0: 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   leave error mes
a2b0: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
a2c0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
a2d0: 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72     /* Match to r
a2e0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  esult columns of
a2f0: 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
a300: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
a310: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
a320: 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73   ORDER BY values
a330: 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73   to match agains
a340: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
a350: 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
a360: 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
a370: 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69   this value in i
a380: 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d  Table */.  int m
a390: 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20  ustComplete     
a3a0: 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c     /* If TRUE al
a3b0: 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74  l ORDER BYs must
a3c0: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
a3d0: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69  nt nErr = 0;.  i
a3e0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c  nt i, j;.  ExprL
a3f0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20  ist *pEList;..  
a400: 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c  if( pSelect==0 |
a410: 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  | pOrderBy==0 ) 
a420: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
a430: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
a440: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a450: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
a460: 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e  i++){ pOrderBy->
a470: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d  a[i].done = 0; }
a480: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 70 53  .  }.  if( prepS
a490: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
a4a0: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
a4b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
a4c0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
a4d0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
a4e0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
a4f0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53  olumn(pParse, pS
a500: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70  elect->pPrior, p
a510: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
a520: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   0) ){.      ret
a530: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
a540: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
a550: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66  ect->pEList;.  f
a560: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
a570: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
a580: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
a590: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
a5a0: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43  Expr;.    int iC
a5b0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  ol = -1;.    if(
a5c0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
a5d0: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
a5e0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a5f0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
a600: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
a610: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
a620: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
a630: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
a640: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a650: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
a660: 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74   "ORDER BY posit
a670: 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65  ion %d should be
a680: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25   between 1 and %
a690: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43  d",.          iC
a6a0: 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ol, pEList->nExp
a6b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  r);.        nErr
a6c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
a6d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
a6e0: 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65   if( !mustComple
a6f0: 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  te ) continue;. 
a700: 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20       iCol--;.   
a710: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
a720: 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69  iCol<0 && j<pELi
a730: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
a740: 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73  .      if( pELis
a750: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26  t->a[j].zName &&
a760: 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20   (pE->op==TK_ID 
a770: 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  || pE->op==TK_ST
a780: 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20  RING) ){.       
a790: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a   char *zName, *z
a7a0: 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a  Label;.        z
a7b0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
a7c0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
a7d0: 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69     zLabel = sqli
a7e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
a7f0: 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  (&pE->token);.  
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c        assert( zL
a810: 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  abel!=0 );.     
a820: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
a830: 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61  rICmp(zName, zLa
a840: 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20  bel)==0 ){ .    
a850: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
a860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a870: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61    sqliteFree(zLa
a880: 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bel);.      }.  
a890: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26      if( iCol<0 &
a8a0: 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
a8b0: 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d  pare(pE, pEList-
a8c0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[j].pExpr) ){.
a8d0: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
a8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a8f0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
a900: 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20  ){.      pE->op 
a910: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
a920: 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d     pE->iColumn =
a930: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d   iCol;.      pE-
a940: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
a950: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67  ;.      pE->iAgg
a960: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72   = -1;.      pOr
a970: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
a980: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
a990: 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75  if( iCol<0 && mu
a9a0: 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  stComplete ){.  
a9b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a9c0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
a9d0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65      "ORDER BY te
a9e0: 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65  rm number %d doe
a9f0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
aa00: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20  result column", 
aa10: 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72  i+1);.      nErr
aa20: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
aa30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
aa40: 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65  urn nErr;  .}.#e
aa50: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
aa60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
aa70: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
aa80: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
aa90: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
aaa0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
aab0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
aac0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
aad0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
aae0: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
aaf0: 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
ab00: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
ab10: 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
ab20: 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
ab30: 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
ab40: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ab50: 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  be;.  if( v==0 )
ab60: 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65  {.    v = pParse
ab70: 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65  ->pVdbe = sqlite
ab80: 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
ab90: 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72  se->db);.  }.  r
aba0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn v;.}../*.*
abb0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
abc0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
abd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
abe0: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
abf0: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
ac00: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
ac10: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
ac20: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
ac30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
ac40: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
ac50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
ac60: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
ac70: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
ac80: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
ac90: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
aca0: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
acb0: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
acc0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
acd0: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
ace0: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
acf0: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
ad00: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
ad10: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
ad20: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
ad30: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
ad40: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
ad50: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
ad60: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
ad70: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
ad80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ad90: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
ada0: 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74  values if iLimit
adb0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
adc0: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
add0: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
ade0: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
adf0: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
ae00: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
ae10: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
ae20: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
ae30: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
ae40: 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75  t values.** (usu
ae50: 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77  ally but not alw
ae60: 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f  ays -1) prior to
ae70: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
ae80: 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69  utine..** Only i
ae90: 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70  f pLimit!=0 or p
aea0: 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65  Offset!=0 do the
aeb0: 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
aec0: 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65   get.** redefine
aed0: 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  d.  The UNION AL
aee0: 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20  L operator uses 
aef0: 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f  this property to
af00: 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65   force.** the re
af10: 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  use of the same 
af20: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
af30: 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73   registers acros
af40: 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45  s multiple.** SE
af50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
af60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af70: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
af80: 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61  sters(Parse *pPa
af90: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
afa0: 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 2f  int iBreak){.  /
afb0: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
afc0: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
afd0: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
afe0: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
aff0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
b000: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
b010: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
b020: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
b030: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
b040: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
b050: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
b060: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
b070: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
b080: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
b090: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
b0a0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
b0b0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b0c0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
b0d0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
b0e0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
b0f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b100: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
b110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b120: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b130: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b150: 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
b160: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
b170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b180: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
b190: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
b1a0: 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54  ent((v, "# LIMIT
b1b0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
b1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1d0: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
b1e0: 6f 2c 20 69 4d 65 6d 2c 20 69 42 72 65 61 6b 29  o, iMem, iBreak)
b1f0: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
b200: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
b210: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
b220: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
b230: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
b240: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
b250: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b260: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b270: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
b280: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b290: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
b2a0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
b2b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b2c0: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
b2d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b2e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
b2f0: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
b300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b310: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
b320: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
b330: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
b340: 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74   "# OFFSET count
b350: 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  er"));.    p->iO
b360: 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
b370: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
b380: 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69 6e  ate a virtual in
b390: 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 73  dex to use for s
b3a0: 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  orting..*/.stati
b3b0: 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f 72  c void createSor
b3c0: 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20  tingIndex(Parse 
b3d0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
b3e0: 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  *p, ExprList *pO
b3f0: 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20 70  rderBy){.  if( p
b400: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
b410: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73 73  nt addr;.    ass
b420: 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 69  ert( pOrderBy->i
b430: 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20  ECursor==0 );.  
b440: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
b450: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
b460: 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20  Tab++;.    addr 
b470: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b480: 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  Op(pParse->pVdbe
b490: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
b4a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
b4c0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
b4d0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
b4e0: 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r+1);.    assert
b4f0: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
b500: 74 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  t[2] == -1 );.  
b510: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
b520: 74 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d  t[2] = addr;.  }
b530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70  .}../*.** The op
b540: 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 73 20  code at addr is 
b550: 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  an OP_OpenVirtua
b560: 6c 20 74 68 61 74 20 63 72 65 61 74 65 64 20 61  l that created a
b570: 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 69 6e 64 65   sorting.** inde
b580: 78 20 74 68 61 20 77 65 20 65 6e 64 65 64 20 75  x tha we ended u
b590: 70 20 6e 6f 74 20 6e 65 65 64 69 6e 67 2e 20 20  p not needing.  
b5a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
b5b0: 6e 67 65 73 20 74 68 61 74 0a 2a 2a 20 6f 70 63  nges that.** opc
b5c0: 6f 64 65 20 74 6f 20 4f 50 5f 4e 6f 6f 70 2e 0a  ode to OP_Noop..
b5d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
b5e0: 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e  ncreateSortingIn
b5f0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
b600: 65 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  e, int addr){.  
b610: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
b620: 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64 62 65 4f  ->pVdbe;.  VdbeO
b630: 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33  p *pOp = sqlite3
b640: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64  VdbeGetOp(v, add
b650: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
b660: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
b670: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 70 2d  r, 0, 0);.  pOp-
b680: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
b690: 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30  p;.  pOp->p1 = 0
b6a0: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 30 3b  ;.  pOp->p2 = 0;
b6b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b6c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b6d0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
b6e0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
b6f0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
b700: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
b710: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
b720: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
b730: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
b740: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
b750: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
b760: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
b770: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
b780: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
b790: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
b7a0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
b7b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
b7c0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
b7d0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
b7e0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
b7f0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
b800: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
b810: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
b830: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
b840: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
b850: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
b860: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
b870: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
b880: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
b890: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
b8a0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
b8b0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
b8c0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
b8d0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
b8e0: 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d    }.  if( pRet==
b8f0: 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  0 ){.    pRet = 
b900: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
b910: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
b920: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
b930: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
b940: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
b950: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b960: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b970: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
b980: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b990: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
b9a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b9b0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
b9c0: 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73   a query that is
b9d0: 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f   really the unio
b9e0: 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63  n.** or intersec
b9f0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d  tion of two or m
ba00: 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
ba10: 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20  ries..**.** "p" 
ba20: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
ba30: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
ba40: 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
ba50: 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
ba60: 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
ba70: 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
ba80: 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
ba90: 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
baa0: 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
bab0: 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
bac0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
bad0: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
bae0: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
baf0: 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
bb00: 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
bb10: 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
bb20: 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
bb30: 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
bb40: 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
bb50: 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
bb60: 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
bb70: 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
bb80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
bb90: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
bba0: 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
bbb0: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
bbc0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
bbd0: 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
bbe0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
bbf0: 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
bc00: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
bc10: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
bc20: 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
bc30: 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
bc40: 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
bc60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bc70: 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
bc80: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
bc90: 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
bca0: 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
bcb0: 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
bcc0: 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
bcd0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
bce0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
bcf0: 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
bd00: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
bd10: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
bd20: 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
bd30: 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
bd40: 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
bd50: 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
bd60: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
bd70: 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
bd80: 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
bd90: 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
bda0: 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
bdb0: 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
bdc0: 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
bdd0: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
bde0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bdf0: 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
be00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
be10: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
be20: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
be30: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
be40: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
be50: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
be60: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
be70: 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
be80: 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20         /* \___  
be90: 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75  Store query resu
bea0: 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64  lts as specified
beb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f              /* /
bed0: 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77       by these tw
bee0: 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20  o parameters.   
bef0: 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20        */.  char 
bf00: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
bf10: 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
bf20: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
bf30: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
bf40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
bf50: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
bf60: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
bf70: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
bf80: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
bf90: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
bfa0: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
bfb0: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
bfc0: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
bfd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
bfe0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bff0: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
c000: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
c010: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c020: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
c030: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
c040: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
c050: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
c060: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c070: 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61   on p */.  int a
c080: 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20  SetP2[2];       
c090: 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65   /* Set P2 value
c0a0: 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20   of these op to 
c0b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
c0c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50  s */.  int nSetP
c0d0: 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  2 = 0;       /* 
c0e0: 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20  Number of slots 
c0f0: 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64  in aSetP2[] used
c100: 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   */..  /* Make s
c110: 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
c120: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
c130: 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
c140: 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
c150: 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
c160: 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
c170: 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
c180: 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
c190: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
c1a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20    */.  if( p==0 
c1b0: 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  || p->pPrior==0 
c1c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
c1d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c1e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
c1f0: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
c200: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
c210: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
c220: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
c230: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
c240: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
c250: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28  ghtmost );.  if(
c260: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
c270: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c280: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
c290: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
c2a0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
c2b0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
c2c0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
c2d0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
c2e0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
c2f0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c300: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
c310: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
c320: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
c330: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
c340: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
c350: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
c360: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
c370: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
c380: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
c390: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
c3a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c3b0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
c3c0: 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61  ure we have a va
c3d0: 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65  lid query engine
c3e0: 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74  .  If not, creat
c3f0: 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
c400: 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
c410: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c420: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
c430: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
c440: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c450: 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  end;.  }..  /* C
c460: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
c470: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
c480: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
c490: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ry.  */.  if( eD
c4a0: 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c  est==SRT_Virtual
c4b0: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
c4c0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
c4d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74      assert( nSet
c4e0: 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32  P2<sizeof(aSetP2
c4f0: 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b  )/sizeof(aSetP2[
c500: 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74 50  0]) );.    aSetP
c510: 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71  2[nSetP2++] = sq
c520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c530: 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c  , OP_OpenVirtual
c540: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
c550: 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62   eDest = SRT_Tab
c560: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  le;.  }..  /* Ge
c570: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
c580: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67  the left and rig
c590: 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ht SELECT statem
c5a0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72  ents..  */.  pOr
c5b0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
c5c0: 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70  rBy;.  switch( p
c5d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
c5e0: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
c5f0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
c600: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c610: 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
c620: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
c630: 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20  r->pLimit );.   
c640: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
c650: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
c660: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
c670: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
c680: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72  ffset;.        r
c690: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c6a0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
c6b0: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
c6c0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
c6d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
c6e0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
c6f0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
c700: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c710: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c720: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
c730: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
c740: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
c750: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
c760: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
c770: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
c780: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   0;.        p->p
c790: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c7a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
c7b0: 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t>=0 ){.        
c7c0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c7d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c7e0: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c  IfMemZero, p->iL
c7f0: 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  imit, 0);.      
c800: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
c810: 28 76 2c 20 22 23 20 4a 75 6d 70 20 61 68 65 61  (v, "# Jump ahea
c820: 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68  d if LIMIT reach
c830: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ed"));.        }
c840: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c850: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c860: 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50  se, p, eDest, iP
c870: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66  arm, 0, 0, 0, af
c880: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  f);.        p->p
c890: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
c8a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
c8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
c8c0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c8d0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
c8e0: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
c8f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c910: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20  , addr);.       
c920: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
c930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c940: 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  /* For UNION ALL
c950: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61   ... ORDER BY fa
c960: 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ll through to th
c970: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
c980: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c990: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
c9a0: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
c9b0: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
c9c0: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
c9d0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
c9e0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
c9f0: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
ca00: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
ca10: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
ca20: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
ca30: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
ca40: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
ca50: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
ca60: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
ca70: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
ca80: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
ca90: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
caa0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
cab0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
cac0: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
cad0: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
cae0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a       int addr;..
caf0: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
cb00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20  p->op==TK_ALL ? 
cb10: 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f  SRT_Table : SRT_
cb20: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
cb30: 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20   eDest==priorOp 
cb40: 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  && pOrderBy==0 &
cb50: 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20  & !p->pLimit && 
cb60: 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20  !p->pOffset ){. 
cb70: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
cb80: 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
cb90: 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
cba0: 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
cbb0: 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
cbc0: 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
cbd0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
cbe0: 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20  Tab = iParm;.   
cbf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc00: 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
cc10: 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
cc20: 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
cc30: 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
cc40: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
cc50: 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
cc60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
cc70: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
cc80: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
cc90: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
cca0: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
ccb0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
ccc0: 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 2c  se, p, pOrderBy,
ccd0: 20 75 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b 0a   unionTab,1) ){.
cce0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
ccf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
cd00: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
cd10: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
cd20: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
cd30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cd40: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
cd50: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
cd60: 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f        if( priorO
cd70: 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a  p==SRT_Table ){.
cd80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
cd90: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
cda0: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
cdb0: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
cdc0: 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53         aSetP2[nS
cdd0: 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a  etP2++] = addr;.
cde0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cdf0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ce00: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
ce10: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
ce20: 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
ce30: 65 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72  enVirt[0] = addr
ce40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
ce50: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56  Rightmost->usesV
ce60: 69 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  irt = 1;.       
ce70: 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74   }.        creat
ce80: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  eSortingIndex(pP
ce90: 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42  arse, p, pOrderB
cea0: 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  y);.        asse
ceb0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
cec0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ced0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
cee0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
cef0: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
cf00: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
cf10: 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
cf20: 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  By );.      rc =
cf30: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
cf40: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
cf50: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
cf60: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
cf70: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
cf80: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
cf90: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cfa0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
cfb0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
cfc0: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
cfd0: 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
cfe0: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
cff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73   ){.         cas
d000: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70  e TK_EXCEPT:  op
d010: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20   = SRT_Except;  
d020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d030: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
d040: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
d050: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
d060: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
d070: 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54  :     op = SRT_T
d080: 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a  able;    break;.
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
d0a0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
d0b0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
d0c0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73   0;.      p->dis
d0d0: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70  allowOrderBy = p
d0e0: 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20  OrderBy!=0;.    
d0f0: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
d100: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
d110: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
d120: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
d130: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d140: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
d150: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
d160: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
d170: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30   op, unionTab, 0
d180: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
d190: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d1a0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
d1b0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
d1c0: 65 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69  erBy;.      sqli
d1d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
d1e0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
d1f0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
d200: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
d210: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
d220: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
d230: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69  = -1;.      p->i
d240: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20  Offset = -1;.   
d250: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d260: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d270: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d280: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
d290: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
d2a0: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
d2b0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
d2c0: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
d2d0: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
d2e0: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
d2f0: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
d300: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21        if( eDest!
d310: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
d320: 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20  nTab!=iParm ){. 
d330: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
d340: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d350: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d360: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
d370: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
d380: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
d390: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  {.          gene
d3a0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
d3b0: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
d3c0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
d3d0: 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20  .        iBreak 
d3e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d3f0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d400: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d410: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d420: 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  v);.        comp
d430: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
d440: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
d450: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
d460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d470: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
d480: 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a  onTab, iBreak);.
d490: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
d4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d4b0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
d4c0: 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49      rc = selectI
d4d0: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
d4e0: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
d4f0: 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
d500: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
d530: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
d540: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
d570: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
d580: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
d590: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
d5a0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d5b0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d5c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
d5d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d5e0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
d5f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d600: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
d610: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
d620: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
d630: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d640: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
d650: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d660: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d670: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
d680: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
d690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d6a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
d6b0: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
d6c0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
d6d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
d6e0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d6f0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
d700: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
d710: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
d720: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
d730: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
d740: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
d750: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
d760: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
d770: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
d780: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
d790: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
d7a0: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
d7b0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
d7c0: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
d7d0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
d7e0: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
d7f0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
d800: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
d810: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
d820: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ( pOrderBy && ma
d830: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
d840: 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 4f 72 64  mn(pParse,p,pOrd
d850: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
d860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
d870: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d880: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65       }.      cre
d8a0: 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
d8b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
d8c0: 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  rBy);..      add
d8d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d8e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  ddOp(v, OP_OpenV
d8f0: 69 72 74 75 61 6c 2c 20 74 61 62 31 2c 20 30 29  irtual, tab1, 0)
d900: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d910: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
d920: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
d930: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72    p->addrOpenVir
d940: 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  t[0] = addr;.   
d950: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
d960: 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a  ->usesVirt = 1;.
d970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d980: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
d990: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
d9a0: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
d9b0: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
d9c0: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
d9d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
d9e0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d9f0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
da00: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
da10: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
da20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
da30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
da40: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
da50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
da60: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
da70: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
da80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
da90: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
daa0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
dab0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
dac0: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
dad0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
dae0: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
daf0: 70 65 6e 56 69 72 74 5b 31 5d 20 3d 3d 20 2d 31  penVirt[1] == -1
db00: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
db10: 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20 61  rOpenVirt[1] = a
db20: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ddr;.      p->pP
db30: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
db40: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
db50: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
db60: 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
db70: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
db80: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
db90: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
dba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
dbb0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53  ect(pParse, p, S
dbc0: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20  RT_Union, tab2, 
dbd0: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
dbe0: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
dbf0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73   pPrior;.      s
dc00: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
dc10: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  (p->pLimit);.   
dc20: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
dc30: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
dc40: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
dc50: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  t;.      if( rc 
dc60: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
dc70: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
dc80: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
dc90: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
dca0: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
dcb0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
dcc0: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
dcd0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
dce0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
dcf0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
dd00: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  t );.      if( e
dd10: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
dd20: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65  ck ){.        ge
dd30: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dd40: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e  s(pParse, 0, p->
dd50: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
dd60: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
dd70: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
dd80: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
dd90: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
dda0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
ddb0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
ddc0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
ddd0: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
dde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ddf0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
de00: 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
de10: 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  k);.      iStart
de20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
de30: 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  dOp(v, OP_RowKey
de40: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
de50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de60: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
de70: 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29 3b  d, tab2, iCont);
de80: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65  .      rc = sele
de90: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
dea0: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
deb0: 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73  , tab1, p->pELis
dec0: 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  t->nExpr,.      
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c         pOrderBy,
def0: 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72   -1, eDest, iPar
df00: 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  m, .            
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
df30: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
df40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
df50: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
df60: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
df70: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
df80: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
df90: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
dfa0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
dfb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dfc0: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
dfd0: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
dfe0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
dff0: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
e000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e010: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f  eAddOp(v, OP_Clo
e020: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
e030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e040: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
e050: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
e060: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e070: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
e080: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
e090: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
e0a0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
e0b0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
e0c0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
e0d0: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
e0e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
e0f0: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
e100: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
e110: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e120: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
e130: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
e140: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e150: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
e160: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
e170: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
e180: 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
e190: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
e1a0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
e1b0: 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
e1c0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
e1d0: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
e1e0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e1f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
e200: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e210: 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72 61  lumns in tempora
e220: 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20  ry tables.  */. 
e230: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
e240: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69 6c  t->nExpr;.  whil
e250: 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20 20  e( nSetP2 ){.   
e260: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e270: 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b 2d  geP2(v, aSetP2[-
e280: 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b  -nSetP2], nCol);
e290: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
e2a0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
e2b0: 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 65  uences used by e
e2c0: 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52 20  ither the ORDER 
e2d0: 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20 2a  BY clause or.  *
e2e0: 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72 61  * by any tempora
e2f0: 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
e300: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
e310: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
e320: 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
e330: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
e340: 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
e350: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 49  orary tables.  I
e360: 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 4f  nvoke the.  ** O
e370: 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73 69  RDER BY processi
e380: 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ng if there is a
e390: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
e3a0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
e3b0: 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
e3c0: 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
e3d0: 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
e3e0: 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
e3f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e400: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
e410: 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
e420: 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
e430: 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
e440: 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
e450: 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
e460: 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
e470: 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
e480: 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
e490: 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
e4a0: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
e4b0: 20 7c 7c 20 70 2d 3e 75 73 65 73 56 69 72 74 20   || p->usesVirt 
e4c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e4f0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
e500: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
e510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
e520: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
e530: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
e540: 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
e550: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
e560: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
e570: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
e580: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
e590: 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
e5a0: 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f  **apColl;.    Co
e5b0: 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a  llSeq **aCopy;..
e5c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e5d0: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
e5e0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
e5f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65  qliteMalloc(size
e600: 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43  of(*pKeyInfo)+nC
e610: 6f 6c 2a 32 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  ol*2*sizeof(Coll
e620: 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20  Seq*) + nCol);. 
e630: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
e640: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e650: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e660: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e670: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
e680: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
e690: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
e6a0: 3e 65 6e 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e  >enc;.    pKeyIn
e6b0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f  fo->nField = nCo
e6c0: 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  l;..    for(i=0,
e6d0: 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f   apColl=pKeyInfo
e6e0: 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b  ->aColl; i<nCol;
e6f0: 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b   i++, apColl++){
e700: 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d  .      *apColl =
e710: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
e720: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
e730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
e740: 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  *apColl ){.     
e750: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50 61     *apColl = pPa
e760: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
e770: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
e780: 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
e790: 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
e7a0: 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
e7b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e7c0: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
e7d0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
e7e0: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  oop->addrOpenVir
e7f0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  t[i];.        if
e800: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
e810: 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
e820: 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
e830: 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
e840: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
e850: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
e860: 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
e870: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
e880: 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
e890: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
e8a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
e8b0: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  oop->addrOpenVir
e8c0: 74 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  t[1]<0 );.      
e8d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e8e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e8f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
e900: 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
e910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e920: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
e930: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
e940: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
e950: 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
e960: 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  }..    if( pOrde
e970: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72  rBy ){.      str
e980: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e990: 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72 64  m *pOTerm = pOrd
e9a0: 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20 69  erBy->a;.      i
e9b0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
e9c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
e9d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
e9e0: 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
e9f0: 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d  ;..      aCopy =
ea00: 20 28 43 6f 6c 6c 53 65 71 2a 2a 29 26 70 4b 65   (CollSeq**)&pKe
ea10: 79 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 20 20  yInfo[1];.      
ea20: 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  pSortOrder = pKe
ea30: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
ea40: 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b  r = (u8*)&aCopy[
ea50: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 6d 65  nExpr];.      me
ea60: 6d 63 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79  mcpy(aCopy, pKey
ea70: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f  Info->aColl, nCo
ea80: 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  l*sizeof(CollSeq
ea90: 2a 29 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c  *));.      apCol
eaa0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
eab0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
eac0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
ead0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65  nExpr; i++, pOTe
eae0: 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20  rm++, apColl++, 
eaf0: 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20  pSortOrder++){. 
eb00: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
eb10: 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78  pr = pOTerm->pEx
eb20: 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  pr;.        char
eb30: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 54 65 72 6d   *zName = pOTerm
eb40: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
eb50: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
eb60: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
eb70: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
eb80: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  nCol );.        
eb90: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
eba0: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
ebb0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
ebc0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e  llSeq(pParse, zN
ebd0: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
ebe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ebf0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f     *apColl = aCo
ec00: 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  py[pExpr->iColum
ec10: 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n];.        }.  
ec20: 20 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65        *pSortOrde
ec30: 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74  r = pOTerm->sort
ec40: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
ec50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ec60: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
ec70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ec80: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
ec90: 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64  ]>=0 );.      ad
eca0: 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e  dr = p->addrOpen
ecb0: 56 69 72 74 5b 32 5d 3b 0a 20 20 20 20 20 20 73  Virt[2];.      s
ecc0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ecd0: 50 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70  P2(v, addr, p->p
ece0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b  EList->nExpr+2);
ecf0: 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  .      pKeyInfo-
ed00: 3e 6e 46 69 65 6c 64 20 3d 20 70 4f 72 64 65 72  >nField = pOrder
ed10: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
ed20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ed30: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
ed40: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
ed50: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
ed60: 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  F);.      pKeyIn
ed70: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65  fo = 0;.      ge
ed80: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
ed90: 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e  Parse, p, v, p->
eda0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
edb0: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
edc0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 46    }..    sqliteF
edd0: 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
ede0: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
edf0: 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
ee00: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ee10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
ee20: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
ee30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee40: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63  IT_VIEW./*.** Sc
ee50: 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
ee60: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
ee70: 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
ee80: 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
ee90: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
eea0: 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
eeb0: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
eec0: 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
eed0: 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
eee0: 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
eef0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
ef00: 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
ef10: 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
ef20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ef30: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
ef40: 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
ef50: 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
ef60: 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
ef70: 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
ef80: 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
ef90: 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
efa0: 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
efb0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
efc0: 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
efd0: 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
efe0: 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
eff0: 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
f000: 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
f010: 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
f020: 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
f030: 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
f040: 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
f050: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
f060: 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
f070: 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
f080: 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
f090: 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
f0a0: 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
f0b0: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
f0c0: 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
f0d0: 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f  t,ExprList*);  /
f0e0: 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
f0f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
f100: 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
f110: 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
f120: 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  t *);  /* Forwar
f130: 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
f140: 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
f150: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
f160: 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
f170: 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
f180: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
f190: 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
f1a0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
f1b0: 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
f1c0: 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
f1d0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
f1e0: 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
f1f0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
f200: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
f210: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
f220: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
f230: 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
f240: 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
f250: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
f260: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
f270: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
f280: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20  r->pRight==0 && 
f290: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
f2a0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
f2b0: 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
f2c0: 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
f2d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f2e0: 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  New!=0 );.      
f2f0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
f300: 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  ->op;.      asse
f310: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
f320: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
f330: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
f340: 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d  te3ExprDup(pNew-
f350: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
f360: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
f370: 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
f380: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
f390: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
f3a0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
f3b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f3c0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
f3d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
f3e0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
f3f0: 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
f400: 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ist);.      pExp
f410: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
f420: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
f430: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
f440: 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
f450: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
f460: 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
f470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
f480: 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74  enCopy(&pExpr->t
f490: 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b  oken, &pNew->tok
f4a0: 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
f4b0: 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
f4c0: 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
f4d0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
f4e0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
f4f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
f500: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
f510: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
f520: 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
f530: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
f540: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f550: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
f560: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f570: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
f580: 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
f590: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
f5a0: 73 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70  substSelect(pExp
f5b0: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
f5c0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
f5d0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f5e0: 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
f5f0: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f600: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
f610: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
f620: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
f630: 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
f640: 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
f650: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
f660: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
f670: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
f680: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
f690: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
f6a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
f6b0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
f6c0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
f6d0: 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
f6e0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
f6f0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
f700: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
f710: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
f720: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
f730: 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
f740: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
f750: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
f760: 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
f770: 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
f780: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
f790: 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
f7a0: 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
f7b0: 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  r(p->pHaving, iT
f7c0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
f7d0: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57   substExpr(p->pW
f7e0: 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
f7f0: 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  List);.}.#endif 
f800: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
f810: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
f820: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f830: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
f840: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
f850: 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
f860: 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
f870: 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
f880: 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
f890: 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
f8a0: 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
f8b0: 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
f8c0: 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
f8d0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
f8e0: 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
f8f0: 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
f900: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
f910: 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
f920: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
f930: 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
f940: 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
f950: 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
f960: 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
f970: 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
f980: 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
f990: 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
f9a0: 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
f9b0: 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
f9c0: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
f9d0: 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
f9e0: 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
f9f0: 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
fa00: 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
fa10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
fa20: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
fa30: 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
fa40: 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
fa50: 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
fa60: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
fa70: 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
fa80: 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
fa90: 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
faa0: 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
fab0: 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
fac0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
fad0: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
fae0: 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
faf0: 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
fb00: 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
fb10: 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
fb20: 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
fb30: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
fb40: 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
fb50: 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
fb60: 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
fb70: 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
fb80: 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
fb90: 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
fba0: 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
fbb0: 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
fbc0: 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
fbd0: 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
fbe0: 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
fbf0: 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
fc00: 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
fc10: 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
fc20: 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
fc30: 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
fc40: 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
fc50: 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
fc60: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
fc70: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
fc80: 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
fc90: 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
fca0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
fcb0: 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
fcc0: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
fcd0: 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
fce0: 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
fcf0: 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
fd00: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
fd10: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
fd20: 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
fd30: 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
fd40: 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
fd50: 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20  eft outer join, 
fd60: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  or.**        the
fd70: 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
fd80: 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20   itself a join. 
fd90: 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a   (Ticket #306).*
fda0: 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
fdb0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
fdc0: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
fdd0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
fde0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
fdf0: 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
fe00: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
fe10: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
fe20: 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
fe30: 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
fe40: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
fe50: 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
fe60: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
fe70: 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
fe80: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
fe90: 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
fea0: 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
feb0: 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
fec0: 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
fed0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
fee0: 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
fef0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
ff00: 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
ff10: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
ff20: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
ff30: 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
ff40: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
ff50: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
ff60: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
ff70: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
ff80: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
ff90: 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
ffa0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
ffb0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
ffc0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
ffd0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
ffe0: 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
fff0: 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
10000 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
10010 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
10020 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
10030 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
10040 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73  .**  (12)  The s
10050 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
10060 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
10070 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
10080 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  IN or the.**    
10090 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73      subquery has
100a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
100b0 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63  .  (added by tic
100c0 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20  ket #350).**.** 
100d0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
100e0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
100f0 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
10100 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
10110 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
10120 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
10130 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
10140 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
10150 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
10160 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
10170 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
10180 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
10190 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
101a0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
101b0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
101c0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
101d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
101e0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
101f0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
10200 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
10210 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
10220 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
10230 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
10240 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
10250 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
10260 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
10270 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
10280 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
10290 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
102a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
102b0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
102c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
102d0 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
102e0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
102f0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10310 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
10320 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10330 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
10340 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
10350 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
10360 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
10370 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
10380 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
10390 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
103a0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
103b0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
103c0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
103d0 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
103e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
103f0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
10400 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
10410 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
10420 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
10430 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
10440 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
10450 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
10460 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
10470 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
10480 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
10490 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
104a0 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
104b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
104c0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
104d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
104e0 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
104f0 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
10500 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10510 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
10520 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
10530 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
10540 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
10550 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
10560 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10570 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10580 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
10590 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
105a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
105b0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
105c0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
105d0 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
105e0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
105f0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
10600 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
10610 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
10620 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
10630 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  not..  */.  if( 
10640 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
10650 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
10660 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
10670 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
10680 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
10690 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
106a0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
106b0 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  ];.  pSub = pSub
106c0 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
106d0 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
106e0 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20   );.  if( isAgg 
106f0 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
10700 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10710 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
10720 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
10730 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
10740 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
10750 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
10760 53 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20  SubSrc );.  if( 
10770 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26  (pSub->pLimit &&
10780 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70   p->pLimit) || p
10790 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20  Sub->pOffset || 
107a0 0a 20 20 20 20 20 20 28 70 53 75 62 2d 3e 70 4c  .      (pSub->pL
107b0 69 6d 69 74 20 26 26 20 69 73 41 67 67 29 20 29  imit && isAgg) )
107c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
107d0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
107e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
107f0 69 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73 74  if( pSub->isDist
10800 69 6e 63 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  inct && (pSrc->n
10810 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
10820 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
10830 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69  ;.  }.  if( p->i
10840 73 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62  sDistinct && sub
10850 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
10860 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 2d  urn 0;.  if( (p-
10870 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
10880 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29   || p->pOrderBy)
10890 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
108a0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  By ) return 0;..
108b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
108c0 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
108d0 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
108e0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
108f0 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
10900 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
10910 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
10920 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
10930 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
10940 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
10950 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
10960 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
10970 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
10980 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
10990 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
109a0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
109b0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
109c0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
109d0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
109e0 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
109f0 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
10a00 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
10a10 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
10a20 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  /.  if( pSubSrc-
10a30 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72 6f 6d  >nSrc>1 && iFrom
10a40 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69  >0 && (pSrc->a[i
10a50 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  From-1].jointype
10a60 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
10a70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10a80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
10a90 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
10aa0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
10ab0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
10ac0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
10ad0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
10ae0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
10af0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
10b00 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
10b10 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
10b20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
10b30 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
10b40 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
10b50 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
10b60 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
10b70 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
10b80 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
10b90 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
10ba0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
10bb0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
10bc0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
10bd0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
10be0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
10bf0 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
10c00 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
10c10 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
10c20 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
10c30 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
10c40 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
10c50 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
10c60 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69  R JOIN..  */.  i
10c70 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70  f( iFrom>0 && (p
10c80 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e  Src->a[iFrom-1].
10c90 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
10ca0 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 26  TER)!=0 .      &
10cb0 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65 21 3d  & pSub->pWhere!=
10cc0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10cd0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
10ce0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
10cf0 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
10d00 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
10d10 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
10d20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
10d30 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
10d40 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
10d50 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20  r query..  */.. 
10d60 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20   /* Move all of 
10d70 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
10d80 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
10d90 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
10da0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
10db0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
10dc0 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
10dd0 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
10de0 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
10df0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
10e00 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
10e10 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
10e20 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
10e30 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
10e40 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
10e50 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
10e60 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
10e70 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
10e80 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
10e90 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
10ea0 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
10eb0 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
10ec0 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
10ed0 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
10ee0 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
10ef0 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
10f00 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
10f10 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
10f20 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74 20 3d    */.  iParent =
10f30 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
10f40 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  or;.  {.    int 
10f50 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
10f60 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e 74  c->nSrc;.    int
10f70 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
10f80 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
10f90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
10fa0 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69  teTable(0, pSubi
10fb0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
10fc0 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69  sqliteFree(pSubi
10fd0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
10fe0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
10ff0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
11000 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
11010 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61  (pSubitem->zAlia
11020 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62  s);.    if( nSub
11030 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  Src>1 ){.      i
11040 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62 53  nt extra = nSubS
11050 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f  rc - 1;.      fo
11060 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=1; i<nSubSrc
11070 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11080 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
11090 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72 63  cListAppend(pSrc
110a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
110b0 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  .      p->pSrc =
110c0 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72   pSrc;.      for
110d0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
110e0 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b   i-extra>=iFrom;
110f0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70   i--){.        p
11100 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63  Src->a[i] = pSrc
11110 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20  ->a[i-extra];.  
11120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11130 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
11140 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
11150 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
11160 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
11170 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
11180 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
11190 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
111a0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
111b0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
111c0 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a 6f 69  m+nSubSrc-1].joi
111d0 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
111e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
111f0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
11200 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
11210 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
11220 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72 65 66  ns for .  ** ref
11230 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
11240 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
11250 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20  ter query..  ** 
11260 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20  .  ** Example:. 
11270 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c 45 43   **.  **   SELEC
11280 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d  T a+5, b*10 FROM
11290 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20   (SELECT x*3 AS 
112a0 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f  a, y+10 AS b FRO
112b0 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b  M t1) WHERE a>b;
112c0 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20  .  **   \       
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
112e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
112f0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
11300 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 2a  /          /.  *
11310 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
11320 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
11330 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
11340 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11350 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a  ______/.  **.  *
11360 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
11370 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
11380 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11390 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
113a0 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22 61 22   we see.  ** "a"
113b0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
113c0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
113d0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
113e0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
113f0 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73 75 62  +10"..  */.  sub
11400 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
11410 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
11420 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
11430 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  pList = p->pELis
11440 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
11450 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
11460 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
11470 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  xpr;.    if( pLi
11480 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
11490 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c  0 && (pExpr = pL
114a0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
114b0 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20  ->span.z!=0 ){. 
114c0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d       pList->a[i]
114d0 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  .zName = sqliteS
114e0 74 72 4e 44 75 70 28 70 45 78 70 72 2d 3e 73 70  trNDup(pExpr->sp
114f0 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
11500 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
11510 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
11520 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
11530 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  (p->pGroupBy, iP
11540 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
11550 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
11560 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
11570 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
11580 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  EList);.  }.  if
11590 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
115a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
115b0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
115c0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
115d0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
115e0 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f  By;.    pSub->pO
115f0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
11600 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  lse if( p->pOrde
11610 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74  rBy ){.    subst
11620 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
11630 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
11640 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
11650 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57  }.  if( pSub->pW
11660 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65  here ){.    pWhe
11670 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
11680 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
11690 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
116a0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
116b0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
116c0 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
116d0 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
116e0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
116f0 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
11700 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
11710 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
11720 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
11730 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
11740 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
11750 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
11760 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61  e3ExprAnd(p->pHa
11770 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70  ving, sqlite3Exp
11780 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
11790 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
117a0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
117b0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
117c0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
117d0 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
117e0 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
117f0 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
11800 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
11810 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
11820 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
11830 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
11840 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  nd(p->pWhere, pW
11850 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
11860 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
11870 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
11880 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
11890 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
118a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
118b0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
118c0 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
118d0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
118e0 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
118f0 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
11900 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
11910 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
11920 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
11930 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
11940 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
11950 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
11960 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
11970 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
11980 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
11990 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
119a0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
119b0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
119c0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
119d0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
119e0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
119f0 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
11a00 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
11a10 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11a20 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
11a30 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
11a40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11a50 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
11a60 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
11a70 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
11a80 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
11a90 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
11aa0 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
11ab0 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
11ac0 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
11ad0 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
11ae0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
11af0 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
11b00 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
11b10 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
11b20 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
11b30 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
11b40 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
11b50 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
11b60 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
11b70 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
11b80 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
11b90 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
11ba0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
11bb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
11bc0 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
11bd0 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
11be0 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
11bf0 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
11c00 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
11c10 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
11c20 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
11c30 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
11c40 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
11c50 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
11c60 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
11c70 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
11c80 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
11c90 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
11ca0 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
11cb0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
11cc0 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
11cd0 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
11ce0 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
11cf0 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
11d00 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
11d10 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
11d20 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
11d30 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53   as for sqlite3S
11d40 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
11d50 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
11d60 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
11d70 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
11d80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
11d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
11da0 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
11db0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11dc0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
11dd0 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
11de0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
11df0 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
11e00 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
11e10 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
11e20 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
11e30 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
11e40 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
11e50 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
11e60 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
11e70 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
11e80 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
11e90 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 0a  rc;.  int brk;..
11ea0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
11eb0 65 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20  e if this query 
11ec0 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
11ed0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
11ee0 2e 20 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a  .  Return.  ** z
11ef0 65 72 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f  ero if it is  no
11f00 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
11f10 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e  >pGroupBy || p->
11f20 70 48 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57  pHaving || p->pW
11f30 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
11f40 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
11f50 63 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  c;.  if( pSrc->n
11f60 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20  Src!=1 ) return 
11f70 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  0;.  pEList = p-
11f80 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
11f90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
11fa0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
11fb0 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  xpr = pEList->a[
11fc0 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
11fd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
11fe0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
11ff0 75 72 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d  urn 0;.  pList =
12000 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
12010 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c   if( pList==0 ||
12020 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31   pList->nExpr!=1
12030 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12040 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
12050 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b  n!=3 ) return 0;
12060 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
12070 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
12080 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d  ken.z,"min",3)==
12090 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
120a0 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d  = OP_Rewind;.  }
120b0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
120c0 53 74 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e  StrNICmp(pExpr->
120d0 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29  token.z,"max",3)
120e0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
120f0 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d  p = OP_Last;.  }
12100 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
12110 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70 72 20   0;.  }.  pExpr 
12120 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  = pList->a[0].pE
12130 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
12140 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
12150 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43  ) return 0;.  iC
12160 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
12170 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20 70 53  umn;.  pTab = pS
12180 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  rc->a[0].pTab;..
12190 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
121a0 6f 20 68 65 72 65 2c 20 69 74 20 6d 65 61 6e 73  o here, it means
121b0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
121c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 6f 72   the correct for
121d0 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  m..  ** Check to
121e0 20 6d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   make sure we ha
121f0 76 65 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  ve an index and 
12200 6d 61 6b 65 20 70 49 64 78 20 70 6f 69 6e 74 20  make pIdx point 
12210 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61 70 70 72  to the.  ** appr
12220 6f 70 72 69 61 74 65 20 69 6e 64 65 78 2e 20 20  opriate index.  
12230 49 66 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  If the min() or 
12240 6d 61 78 28 29 20 69 73 20 6f 6e 20 61 6e 20 49  max() is on an I
12250 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 0a 20  NTEGER PRIMARY. 
12260 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20   ** key column, 
12270 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e 65 63 65  no index is nece
12280 73 73 61 72 79 20 73 6f 20 73 65 74 20 70 49 64  ssary so set pId
12290 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e  x to NULL.  If n
122a0 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e  o.  ** usable in
122b0 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65  dex is found, re
122c0 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
122d0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
122e0 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c   pIdx = 0;.  }el
122f0 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  se{.    CollSeq 
12300 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
12310 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
12320 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
12330 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
12340 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
12350 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
12360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
12370 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29  dx->nColumn>=1 )
12380 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
12390 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
123a0 43 6f 6c 20 26 26 20 70 49 64 78 2d 3e 6b 65 79  Col && pIdx->key
123b0 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70  Info.aColl[0]==p
123c0 43 6f 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  Coll ) break;.  
123d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
123e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
123f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69    }..  /* Identi
12400 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20  fy column types 
12410 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
12420 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  ing the callback
12430 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
12440 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
12450 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
12460 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ing to a table o
12470 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  r a memory cell.
12480 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  .  ** The column
12490 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65   names have alre
124a0 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72 61 74  ady been generat
124b0 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ed in the callin
124c0 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f  g function..  */
124d0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
124e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
124f0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
12500 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  rn 0;..  /* If t
12510 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
12520 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
12530 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
12540 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
12550 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
12560 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29  SRT_VirtualTab )
12570 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12580 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
12590 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c  nVirtual, iParm,
125a0 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   1);.  }..  /* G
125b0 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 20 74  enerating code t
125c0 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f  o find the min o
125d0 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61 73 69  r the max.  Basi
125e0 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68 61 76  cally all we hav
125f0 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
12600 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 6f  find the first o
12610 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  r the last entry
12620 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e 20 69   in the chosen i
12630 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74  ndex.  If.  ** t
12640 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
12650 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e 54 45  ) is on the INTE
12660 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
12670 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65 20 66   then find the f
12680 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73  irst.  ** or las
12690 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6d  t entry in the m
126a0 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ain table..  */.
126b0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
126c0 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
126d0 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20  , pTab->iDb);.  
126e0 62 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30  base = pSrc->a[0
126f0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b  ].iCursor;.  brk
12700 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
12710 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
12720 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
12730 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62  ers(pParse, p, b
12740 72 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d  rk);.  if( pSrc-
12750 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30  >a[0].pSelect==0
12760 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12770 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69  penTableForReadi
12780 6e 67 28 76 2c 20 62 61 73 65 2c 20 70 54 61 62  ng(v, base, pTab
12790 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
127a0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x==0 ){.    sqli
127b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
127c0 73 65 65 6b 4f 70 2c 20 62 61 73 65 2c 20 30 29  seekOp, base, 0)
127d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
127e0 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
127f0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
12800 20 6f 70 65 6e 20 74 68 65 20 69 6e 64 65 78 20   open the index 
12810 68 65 72 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  here is closed. 
12820 20 20 20 2a 2a 20 61 73 20 73 6f 6f 6e 20 61 73     ** as soon as
12830 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20   a single value 
12840 68 61 73 20 62 65 65 6e 20 72 65 61 64 20 66 72  has been read fr
12850 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63 61 74 65 20  om it, allocate 
12860 69 74 0a 20 20 20 20 2a 2a 20 75 73 69 6e 67 20  it.    ** using 
12870 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 29  (pParse->nTab++)
12880 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
12890 63 75 72 73 6f 72 20 69 64 20 66 72 6f 6d 20 62  cursor id from b
128a0 65 69 6e 67 20 0a 20 20 20 20 2a 2a 20 72 65 75  eing .    ** reu
128b0 73 65 64 2e 20 54 68 69 73 20 69 73 20 69 6d 70  sed. This is imp
128c0 6f 72 74 61 6e 74 20 66 6f 72 20 73 74 61 74 65  ortant for state
128d0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  ments of the for
128e0 6d 20 0a 20 20 20 20 2a 2a 20 22 49 4e 53 45 52  m .    ** "INSER
128f0 54 20 49 4e 54 4f 20 78 20 53 45 4c 45 43 54 20  T INTO x SELECT 
12900 6d 61 78 28 29 20 46 52 4f 4d 20 78 22 2e 0a 20  max() FROM x".. 
12910 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49     */.    int iI
12920 64 78 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70  dx;.    iIdx = p
12930 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12950 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
12960 72 2c 20 70 49 64 78 2d 3e 69 44 62 2c 20 30 29  r, pIdx->iDb, 0)
12970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12980 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  eOp3(v, OP_OpenR
12990 65 61 64 2c 20 69 49 64 78 2c 20 70 49 64 78 2d  ead, iIdx, pIdx-
129a0 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
129b0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
129c0 29 26 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c  )&pIdx->keyInfo,
129d0 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P3_KEYINFO);.  
129e0 20 20 69 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50    if( seekOp==OP
129f0 5f 52 65 77 69 6e 64 20 29 7b 0a 20 20 20 20 20  _Rewind ){.     
12a00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12a10 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
12a20 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
12a30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12a40 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
12a50 20 30 29 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f   0);.      seekO
12a60 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  p = OP_MoveGt;. 
12a70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12a80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65  VdbeAddOp(v, see
12a90 6b 4f 70 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20  kOp, iIdx, 0);. 
12aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12ab0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
12ac0 69 64 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20  id, iIdx, 0);.  
12ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12ae0 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
12af0 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
12b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12b10 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73  , OP_MoveGe, bas
12b20 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69  e, 0);.  }.  eLi
12b30 73 74 2e 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20  st.nExpr = 1;.  
12b40 6d 65 6d 73 65 74 28 26 65 4c 69 73 74 49 74 65  memset(&eListIte
12b50 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69  m, 0, sizeof(eLi
12b60 73 74 49 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73  stItem));.  eLis
12b70 74 2e 61 20 3d 20 26 65 4c 69 73 74 49 74 65 6d  t.a = &eListItem
12b80 3b 0a 20 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70  ;.  eList.a[0].p
12b90 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
12ba0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12bb0 70 50 61 72 73 65 2c 20 70 2c 20 26 65 4c 69 73  pParse, p, &eLis
12bc0 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  t, 0, 0, 0, -1, 
12bd0 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 62 72  eDest, iParm, br
12be0 6b 2c 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71  k, brk, 0);.  sq
12bf0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12c00 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
12c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c20 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62  p(v, OP_Close, b
12c30 61 73 65 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65  ase, 0);.  .  re
12c40 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
12c50 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44   Analyze and ORD
12c60 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
12c70 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 53 45  Y clause in a SE
12c80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
12c90 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
12ca0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
12cb0 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f  seen..**.** An O
12cc0 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
12cd0 20 42 59 20 69 73 20 61 20 6c 69 73 74 20 6f 66   BY is a list of
12ce0 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 49   expressions.  I
12cf0 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
12d00 0a 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65  .** is an intege
12d10 72 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  r constant, then
12d20 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
12d30 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
12d40 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
12d50 64 69 6e 67 20 65 6e 74 72 79 20 69 6e 20 74 68  ding entry in th
12d60 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
12d70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
12d80 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
12d90 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
12da0 70 4e 43 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  pNC,     /* Name
12db0 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
12dc0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12dd0 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  . */.  ExprList 
12de0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
12df0 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
12e00 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
12e10 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
12e20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12e30 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
12e40 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
12e50 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
12e60 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
12e70 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
12e80 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d  t *pEList = pNC-
12e90 3e 70 45 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  >pEList;     /* 
12ea0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
12eb0 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a  f the SELECT */.
12ec0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
12ed0 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20  = pNC->pParse;  
12ee0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
12ef0 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
12f00 43 54 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  CT */.  assert( 
12f10 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 69 66 28  pEList );..  if(
12f20 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
12f30 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
12f40 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
12f50 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
12f60 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
12f70 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
12f80 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
12f90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
12fa0 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
12fb0 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
12fc0 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 69   if( iCol>0 && i
12fd0 43 6f 6c 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78  Col<=pEList->nEx
12fe0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
12ff0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
13000 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 45 20  pE);.        pE 
13010 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
13020 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
13030 45 78 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e  ExprDup(pEList->
13040 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
13050 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
13070 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
13080 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42             "%s B
13090 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
130a0 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
130b0 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
130c0 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
130d0 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79  n 1 and %d", zTy
130e0 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  pe, iCol, pEList
130f0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
13100 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13110 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13120 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
13130 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70  olveNames(pNC, p
13140 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
13150 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
13160 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
13170 73 43 6f 6e 73 74 61 6e 74 28 70 45 29 20 29 7b  sConstant(pE) ){
13180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
13190 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
131a0 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
131b0 74 65 72 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62  terms must not b
131c0 65 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f  e non-integer co
131d0 6e 73 74 61 6e 74 73 22 2c 20 7a 54 79 70 65 29  nstants", zType)
131e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
131f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
13200 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
13210 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
13220 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d 65 73  solves any names
13230 20 75 73 65 64 20 69 6e 20 74 68 65 20 72 65 73   used in the res
13240 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
13250 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c 45 43  * supplied SELEC
13260 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20  T statement. If 
13270 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
13280 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73 6f 6c  ment being resol
13290 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d  ved.** is a sub-
132a0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70 4f 75  select, then pOu
132b0 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69 6e 74  terNC is a point
132c0 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f  er to the NameCo
132d0 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65  ntext .** of the
132e0 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a   parent SELECT..
132f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
13300 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20 20 50  lectResolve(.  P
13310 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
13330 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
13340 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
13350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
13360 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13370 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
13380 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
13390 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68 65 20  OuterNC  /* The 
133a0 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65  outer name conte
133b0 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  xt. May be NULL.
133c0 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
133d0 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
133e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65      /* Result se
133f0 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  t. */.  int i;  
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76     /* For-loop v
13420 61 72 69 61 62 6c 65 20 75 73 65 64 20 69 6e 20  ariable used in 
13430 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 20  multiple places 
13440 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
13450 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
13460 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  /* Local name-co
13470 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
13480 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
13490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67 72 6f        /* The gro
134a0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
134b0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 72 6f  .  /* If this ro
134c0 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20 62 65  utine has run be
134d0 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d  fore, return imm
134e0 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69  ediately. */.  i
134f0 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64  f( p->isResolved
13500 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13510 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20 20 20  !pOuterNC );.   
13520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13530 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65  K;.  }.  p->isRe
13540 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f  solved = 1;..  /
13550 2a 20 49 66 20 74 68 65 72 65 20 68 61 76 65 20  * If there have 
13560 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 72 72  already been err
13570 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ors, do nothing.
13580 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
13590 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
135a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
135b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ROR;.  }..  /* P
135c0 72 65 70 61 72 65 20 74 68 65 20 73 65 6c 65 63  repare the selec
135d0 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  t statement. Thi
135e0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f  s call will allo
135f0 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  cate all cursors
13600 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 74  .  ** required t
13610 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74 61 62  o handle the tab
13620 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 69  les and subqueri
13630 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
13640 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
13650 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
13660 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
13670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13680 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
13690 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
136a0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
136b0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
136c0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
136d0 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c  .  ** are not al
136e0 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
136f0 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
13700 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
13710 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a  meContext..  */.
13720 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
13730 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
13740 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
13750 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73 71 6c  Parse;.  if( sql
13760 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13770 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c  ames(&sNC, p->pL
13780 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73  imit) ||.      s
13790 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
137a0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
137b0 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20  pOffset) ){.    
137c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
137d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ROR;.  }..  /* S
137e0 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
137f0 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
13800 70 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f  pass to ExprReso
13810 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20  lveNames() to.  
13820 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65  ** resolve the e
13830 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a  xpression-list..
13840 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77    */.  sNC.allow
13850 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70  Agg = 1;.  sNC.p
13860 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
13870 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  c;.  sNC.pNext =
13880 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a   pOuterNC;..  /*
13890 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
138a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
138b0 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  . */.  pEList = 
138c0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
138d0 20 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72   !pEList ) retur
138e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
138f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
13900 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
13910 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d  {.    Expr *pX =
13920 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
13930 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
13940 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
13950 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29  ames(&sNC, pX) )
13960 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13970 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
13980 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
13990 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67  there are no agg
139a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
139b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
139c0 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  et, and no GROUP
139d0 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73   BY .  ** expres
139e0 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  sion, do not all
139f0 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e  ow aggregates in
13a00 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65   any of the othe
13a10 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  r expressions.. 
13a20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
13a30 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70 47 72  ->isAgg );.  pGr
13a40 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
13a50 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72 6f 75  pBy;.  if( pGrou
13a60 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67  pBy || sNC.hasAg
13a70 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67  g ){.    p->isAg
13a80 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
13a90 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67      sNC.allowAgg
13aa0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13ab0 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
13ac0 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
13ad0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
13ae0 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
13af0 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13b00 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
13b10 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
13b20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13b30 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
13b40 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
13b50 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
13b60 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ING");.    retur
13b70 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13b80 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
13b90 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
13ba0 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
13bb0 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
13bc0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74  sing the.  ** ot
13bd0 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
13be0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
13bf0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
13c00 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 65 78   so that.  ** ex
13c10 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
13c20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
13c30 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
13c40 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
13c50 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e  .  ** aliases in
13c60 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13c70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72  .  **.  ** Minor
13c80 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20   point: If this 
13c90 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
13ca0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
13cb0 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65   will be.  ** re
13cc0 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65  -evaluated for e
13cd0 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ach reference to
13ce0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e   it..  */.  sNC.
13cf0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
13d00 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  st;.  if( sqlite
13d10 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13d20 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
13d30 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  e) ||.      sqli
13d40 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
13d50 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
13d60 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20 20 70  ving) ||.      p
13d70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70  rocessOrderGroup
13d80 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64  By(&sNC, p->pOrd
13d90 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 7c  erBy, "ORDER") |
13da0 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
13db0 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
13dc0 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  , pGroupBy, "GRO
13dd0 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  UP").  ){.    re
13de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13df0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  R;.  }..  /* Mak
13e00 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
13e10 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
13e20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
13e30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
13e40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
13e50 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
13e60 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13e70 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
13e80 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
13e90 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
13ea0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
13eb0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
13ec0 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
13ed0 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
13ee0 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
13ef0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13f00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13f10 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
13f20 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
13f30 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
13f40 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
13f50 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
13f60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13f70 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
13f80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
13f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13fa0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  K;.}../*.** Rese
13fb0 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
13fc0 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
13fd0 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
13fe0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
13ff0 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
14000 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
14010 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
14020 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
14030 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
14040 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
14050 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20   routine simply 
14060 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
14070 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
14080 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  ory cells..*/.st
14090 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
140a0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
140b0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
140c0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
140d0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
140e0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
140f0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
14100 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
14110 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
14120 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
14130 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
14140 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
14150 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
14160 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
14170 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
14180 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14190 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49 6e 66 6f  emNull, pAggInfo
141a0 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20  ->aCol[i].iMem, 
141b0 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  0);.  }.  for(pF
141c0 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
141d0 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
141e0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
141f0 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
14200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14210 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20  (v, OP_MemNull, 
14220 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b  pFunc->iMem, 0);
14230 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
14240 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
14250 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
14260 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
14270 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
14280 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69  st==0 || pE->pLi
14290 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
142a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
142b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
142c0 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67  "DISTINCT in agg
142d0 72 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66  regate must be f
142e0 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20  ollowed ".      
142f0 20 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72       "by an expr
14300 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ession");.      
14310 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
14320 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
14330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
14340 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
14350 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
14360 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
14370 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
14380 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
14390 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
143a0 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
143b0 69 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20  inct, 0, .      
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
143e0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
143f0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
14400 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
14410 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
14420 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
14430 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
14440 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
14450 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
14460 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
14470 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14480 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
14490 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
144a0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
144b0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
144c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
144d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
144e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
144f0 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
14500 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
14510 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
14520 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
14530 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
14540 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
14550 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
14560 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
14570 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
14580 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
14590 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
145a0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
145b0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
145c0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55  pF->pFunc, P3_FU
145d0 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NCDEF);.  }.}../
145e0 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
145f0 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f  accumulator memo
14600 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20  ry cells for an 
14610 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20  aggregate based 
14620 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
14630 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
14640 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
14650 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61  d updateAccumula
14660 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
14670 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
14680 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
14690 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
146a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
146b0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
146c0 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
146d0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
146e0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
146f0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
14700 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
14710 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
14720 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
14730 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
14740 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
14750 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
14760 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
14770 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
14780 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  pList;.    if( p
14790 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
147a0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
147b0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
147c0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
147d0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
147e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
147f0 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
14800 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
14810 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
14820 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
14830 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14840 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
14850 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
14860 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
14870 6e 63 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74  nct(v, pF->iDist
14880 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
14890 31 2c 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 2);.    }.   
148a0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
148b0 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  needCollSeq ){. 
148c0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
148d0 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
148e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
148f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
14900 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
14910 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
14920 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
14930 26 20 6a 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & j<pList->nExpr
14940 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
14950 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
14960 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
14970 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
14980 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
14990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
149a0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
149b0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
149c0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
149d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
149e0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
149f0 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
14a00 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
14a10 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  3_COLLSEQ);.    
14a20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14a30 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74  eOp3(v, OP_AggSt
14a40 65 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41  ep, pF->iMem, nA
14a50 72 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70  rg, (void*)pF->p
14a60 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46  Func, P3_FUNCDEF
14a70 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
14a80 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
14a90 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14aa0 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
14ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
14ac0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
14ad0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
14ae0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
14af0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
14b00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
14b10 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
14b20 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
14b30 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14b40 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43   OP_MemStore, pC
14b50 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a  ->iMem, 1);.  }.
14b60 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
14b70 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a  ctMode = 0;.}...
14b80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14b90 6f 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ode for the give
14ba0 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
14bb0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  nt..**.** The re
14bc0 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69  sults are distri
14bd0 62 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73  buted in various
14be0 20 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20   ways depending 
14bf0 6f 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  on the.** value 
14c00 6f 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61  of eDest and iPa
14c10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44  rm..**.**     eD
14c20 65 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20  est Value       
14c30 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
14c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
14c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
14c80 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20   SRT_Callback   
14c90 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c   Invoke the call
14ca0 62 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f  back for each ro
14cb0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
14cc0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
14cd0 65 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  em         Store
14ce0 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e   first result in
14cf0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61   memory cell iPa
14d00 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
14d10 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f  _Set         Sto
14d20 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65  re results as ke
14d30 79 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72  ys of table iPar
14d40 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
14d50 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f  _Union       Sto
14d60 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20  re results as a 
14d70 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  key in a tempora
14d80 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
14d90 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
14da0 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
14db0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
14dc0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14dd0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
14de0 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
14df0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
14e00 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
14e10 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54  le iParm.**.** T
14e20 68 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69  he table above i
14e30 73 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41  s incomplete.  A
14e40 64 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20  dditional eDist 
14e50 76 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64  value have be ad
14e60 64 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69  ded.** since thi
14e70 73 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72  s comment was wr
14e80 69 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20  itten.  See the 
14e90 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
14ea0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a  ) function for.*
14eb0 2a 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73  * a complete lis
14ec0 74 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f  ting of the allo
14ed0 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
14ee0 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
14ef0 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
14f00 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
14f10 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
14f20 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
14f30 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
14f40 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
14f50 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
14f60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
14f70 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
14f80 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
14f90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14fa0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
14fb0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
14fc0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
14fd0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
14fe0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
14ff0 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
15000 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
15010 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
15020 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
15030 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
15040 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
15050 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
15060 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
15070 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
15080 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
15090 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
150a0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
150b0 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
150c0 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
150d0 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
150e0 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
150f0 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
15100 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
15110 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
15120 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
15130 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
15140 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
15150 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
15160 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
15170 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
15180 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
15190 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
151a0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
151b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
151c0 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
151d0 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
151e0 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
151f0 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
15200 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
15210 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
15220 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
15230 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
15240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
15270 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
15280 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
15290 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
152a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
152b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
152c0 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
152d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
152e0 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
152f0 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
15300 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
15310 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
15320 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
15330 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
15340 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
15350 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
15360 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
15370 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
15380 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
15390 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
153a0 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
153b0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
153c0 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
153d0 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
153e0 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
153f0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
15400 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
15410 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
15420 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
15430 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
15440 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
15450 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
15460 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
15470 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
15480 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
15490 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
154a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
154b0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
154c0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
154d0 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  d. */.  int eDes
154e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
154f0 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
15500 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
15510 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
15520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15530 20 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20   parameter used 
15540 62 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73  by the eDest dis
15550 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
15560 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
15570 74 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  t,       /* Anot
15580 68 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77  her SELECT for w
15590 68 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73  hich this is a s
155a0 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ub-query */.  in
155b0 74 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20  t parentTab,    
155c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
155d0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f   pParent->pSrc o
155e0 66 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  f this query */.
155f0 20 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67    int *pParentAg
15600 67 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  g,       /* True
15610 20 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73   if pParent uses
15620 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
15630 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
15640 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
15650 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20   /* If eDest is 
15660 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61  SRT_Union, the a
15670 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
15680 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
156a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
156b0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
156c0 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
156d0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
156e0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
156f0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
15700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15710 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
15720 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
15730 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
15740 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
15750 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
15760 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
15770 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
15780 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
15790 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
157a0 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
157b0 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
157c0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
157d0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
157e0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
157f0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
15800 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
15810 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
15820 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
15830 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
15840 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
15850 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
15860 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
15870 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
15880 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
15890 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
158a0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
158b0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
158c0 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
158d0 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
158e0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
158f0 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69  */.  int isDisti
15900 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
15910 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
15920 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
15930 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
15940 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  distinct;       
15950 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75     /* Table to u
15960 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
15970 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  nct set */.  int
15980 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
15990 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
159a0 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
159b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
159c0 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
159d0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
159e0 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69   of an OP_OpenVi
159f0 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
15a00 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  n */.  AggInfo s
15a10 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
15a20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
15a30 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
15a40 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
15a50 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
15a60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
15a70 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15a80 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
15a90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
15aa0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
15ab0 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20  >nErr || p==0 ) 
15ac0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
15ad0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15ae0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15af0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
15b00 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
15b10 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
15b20 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
15b30 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  nfo));..#ifndef 
15b40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
15b50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
15b60 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
15b70 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
15b80 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
15b90 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
15ba0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
15bb0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
15bc0 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
15bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
15be0 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  ect *pLoop;.    
15bf0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
15c00 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
15c10 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
15c20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
15c30 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
15c40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
15c50 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
15c60 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
15c70 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20  , iParm, aff);. 
15c80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72   }.#endif..  pOr
15c90 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
15ca0 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  rBy;.  if( Ignor
15cb0 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73  ableOrderby(eDes
15cc0 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72  t) ){.    p->pOr
15cd0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  derBy = 0;.  }. 
15ce0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
15cf0 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65  ctResolve(pParse
15d00 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  , p, 0) ){.    g
15d10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15d20 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42    }.  p->pOrderB
15d30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
15d40 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
15d50 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
15d60 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
15d70 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
15d80 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
15d90 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  c;.  pWhere = p-
15da0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
15db0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
15dc0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
15dd0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41  ->pHaving;.  isA
15de0 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
15df0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
15e00 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
15e10 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
15e20 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
15e30 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
15e40 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
15e50 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
15e60 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
15e70 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
15e80 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
15e90 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
15ea0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
15eb0 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
15ec0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
15ed0 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
15ee0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
15ef0 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
15f00 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
15f10 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
15f20 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
15f30 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
15f40 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
15f50 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15f60 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  Y.  if( (eDest==
15f70 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
15f80 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
15f90 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
15fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15fb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
15fc0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
15fd0 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
15fe0 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
15ff0 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
16000 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
16010 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
16020 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
16030 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
16040 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
16050 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
16060 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ns..  */.  if( I
16070 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
16080 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f  eDest) ){.    pO
16090 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
160a0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
160b0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
160c0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
160d0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
160e0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
160f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
16100 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
16110 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65 20  umn names if we 
16120 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
16130 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b  em in a callback
16140 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65  .  This.  ** ste
16150 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  p is skipped if 
16160 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
16170 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65  ing to some othe
16180 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20  r destination.. 
16190 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
161a0 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
161b0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
161c0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
161d0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
161e0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  t);.  }..  /* Ge
161f0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16200 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
16210 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
16220 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
16230 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16240 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
16250 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16260 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
16270 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
16280 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
16290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
162a0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
162b0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  0;.    int needR
162c0 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20  estoreContext;. 
162d0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
162e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
162f0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
16300 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
16310 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  >pSelect==0 ) co
16320 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
16330 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
16340 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41  ){.      zSavedA
16350 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  uthContext = pPa
16360 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
16370 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
16380 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
16390 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pItem->zName;.  
163a0 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43      needRestoreC
163b0 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20  ontext = 1;.    
163c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65  }else{.      nee
163d0 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
163e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
163f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
16400 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
16410 65 63 74 2c 20 53 52 54 5f 56 69 72 74 75 61 6c  ect, SRT_Virtual
16420 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Tab, .          
16430 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43         pItem->iC
16440 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73  ursor, p, i, &is
16450 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  Agg, 0);.    if(
16460 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
16470 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ext ){.      pPa
16480 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
16490 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
164a0 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ntext;.    }.   
164b0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
164c0 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20  Src;.    pWhere 
164d0 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
164e0 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
164f0 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b  rderby(eDest) ){
16500 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
16510 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
16520 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42     }.    pGroupB
16530 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
16540 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70  .    pHaving = p
16550 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69  ->pHaving;.    i
16560 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
16570 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23  sDistinct;.  }.#
16580 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
16590 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  k for the specia
165a0 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28  l case of a min(
165b0 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
165c0 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20  ion by itself.  
165d0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
165e0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
165f0 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65   simpleMinMaxQue
16600 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ry(pParse, p, eD
16610 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20  est, iParm) ){. 
16620 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67     rc = 0;.    g
16630 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
16640 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
16650 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69  to see if this i
16660 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61  s a subquery tha
16670 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65  t can be "flatte
16680 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61  ned" into its pa
16690 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c  rent..  ** If fl
166a0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f  attening is a po
166b0 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20  ssiblity, do so 
166c0 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
166d0 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23  iately.  .  */.#
166e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
166f0 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50  IT_VIEW.  if( pP
16700 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74  arent && pParent
16710 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61  Agg &&.      fla
16720 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
16730 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70 61  rse, pParent, pa
16740 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65 6e  rentTab, *pParen
16750 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b 0a  tAgg, isAgg) ){.
16760 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
16770 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31 3b  *pParentAgg = 1;
16780 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
16790 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
167a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
167b0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
167c0 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20 61  lause, resolve a
167d0 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
167e0 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d 65  uences.  ** name
167f0 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
16800 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
16810 69 66 69 65 64 20 61 6e 64 20 63 72 65 61 74 65  ified and create
16820 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
16830 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
16840 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6d   sorting index m
16850 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
16860 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
16870 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a  data can be .  *
16880 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  * extracted in p
16890 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
168a0 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65    If that is the
168b0 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a   case, then the.
168c0 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69 72 74    ** OP_OpenVirt
168d0 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ual instruction 
168e0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
168f0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
16900 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
16910 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
16920 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
16930 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
16940 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
16950 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
16960 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
16970 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
16980 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
16990 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63  rBy ){.    struc
169a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
169b0 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79 49  *pTerm;.    KeyI
169c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
169d0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72     for(i=0, pTer
169e0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
169f0 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
16a00 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
16a10 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
16a20 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
16a30 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d     pTerm->pExpr-
16a40 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
16a50 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
16a60 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61  arse, pTerm->zNa
16a70 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  me, -1);.      }
16a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16a90 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
16aa0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
16ab0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
16ac0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
16ad0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
16ae0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
16af0 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
16b00 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
16b10 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
16b20 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
16b30 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
16b40 78 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74  x =.       sqlit
16b50 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16b60 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 4f 72  OpenVirtual, pOr
16b70 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
16b80 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
16b90 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  +2, .           
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16bb0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
16bc0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
16bd0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16be0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
16bf0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  -1;.  }..  /* Se
16c00 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
16c10 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
16c20 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16c30 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
16c40 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
16c50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
16c60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
16c70 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
16c80 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
16c90 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
16ca0 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
16cb0 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56 69  f( eDest==SRT_Vi
16cc0 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20 20  rtualTab ){.    
16cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16ce0 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
16cf0 61 6c 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73  al, iParm, pELis
16d00 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
16d10 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
16d20 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
16d30 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
16d40 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
16d50 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
16d60 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
16d70 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69  yInfo;.    disti
16d80 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
16d90 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
16da0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
16db0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
16dc0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
16dd0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16de0 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
16df0 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
16e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e10 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
16e20 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
16e30 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
16e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
16e50 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
16e60 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
16e70 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
16e80 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
16e90 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
16ea0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
16eb0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
16ec0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
16ed0 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
16ee0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
16ef0 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
16f00 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
16f10 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
16f20 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
16f30 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
16f40 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
16f50 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  &pOrderBy);.    
16f60 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
16f70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
16f80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
16f90 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
16fa0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
16fb0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 56 69 72  prior OP_OpenVir
16fc0 74 75 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  tual .    ** ins
16fd0 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
16fe0 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
16ff0 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
17000 74 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  the OP_OpenVirtu
17010 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
17020 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
17030 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
17040 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
17050 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
17060 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69     uncreateSorti
17070 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
17080 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
17090 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
170a0 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nVirt[2] = -1;. 
170b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
170c0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
170d0 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a  ner loop.    */.
170e0 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
170f0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
17100 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
17110 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
17120 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69  iParm, pWInfo->i
17150 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
17160 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29  ->iBreak, aff) )
17170 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
17180 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
17190 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
171a0 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
171b0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
171c0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
171d0 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
171e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
171f0 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
17200 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
17210 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
17220 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
17230 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
17240 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
17250 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
17260 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
17270 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
17280 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
17290 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
172a0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
172b0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
172c0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
172d0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
172e0 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
172f0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
17300 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
17310 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
17320 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
17330 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
17340 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
17370 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
17380 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
17390 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
173a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
173b0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
173c0 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
173d0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
173e0 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
173f0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
17400 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
17410 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
17420 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
17430 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
17440 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
17450 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
17460 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
17470 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20   hold addresses 
17480 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61  or labels for pa
17490 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  rts of the.    *
174a0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
174b0 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65  e program we are
174c0 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65   putting togethe
174d0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
174e0 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20  rOutputRow;     
174f0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
17500 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
17510 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
17520 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
17530 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20  rSetAbort;      
17540 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
17550 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
17560 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  n */.    int add
17570 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b  rInitializeLoop;
17580 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
17590 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
175a0 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  es the input loo
175b0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
175c0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20  rTopOfLoop;     
175d0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
175e0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
175f0 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79   int addrGroupBy
17600 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65  Change;  /* Code
17610 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
17620 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
17630 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  m changes */.   
17640 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73   int addrProcess
17650 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65  Row;     /* Code
17660 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
17670 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a  ngle input row *
17680 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
17690 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
176a0 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63   End of all proc
176b0 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  essing */.    in
176c0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
176d0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  ;     /* The OP_
176e0 4f 70 65 6e 56 69 72 74 75 61 6c 20 66 6f 72 20  OpenVirtual for 
176f0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
17700 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  x */.    int add
17710 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20 20  rReset;         
17720 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
17730 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
17740 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
17750 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
17760 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17770 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
17780 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
17790 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
177a0 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
177b0 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
177c0 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
177d0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
177e0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
177f0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
17800 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
17810 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
17820 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
17830 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
17840 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
17850 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
17860 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
17870 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
17880 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
17890 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
178a0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
178b0 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
178c0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
178d0 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
178e0 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
178f0 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69   pGroupBy;.    i
17900 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
17910 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
17920 43 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20 20  C, pEList) ){.  
17930 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
17940 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  end;.    }.    i
17950 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
17960 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
17970 43 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b 0a  C, pOrderBy) ){.
17980 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
17990 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
179a0 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26 20   if( pHaving && 
179b0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
179c0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
179d0 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20  C, pHaving) ){. 
179e0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
179f0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
17a00 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
17a10 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
17a20 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
17a30 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
17a40 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
17a50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17a60 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
17a70 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
17a80 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
17a90 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  ->pList) ){.    
17aa0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
17ab0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
17ac0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
17ad0 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
17ae0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
17af0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
17b00 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
17b10 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
17b20 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
17b30 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
17b40 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
17b50 65 78 20 74 68 61 20 61 67 67 72 65 67 61 74 65  ex tha aggregate
17b60 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
17b70 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
17b80 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
17b90 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
17ba0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
17bb0 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
17bc0 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
17bd0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 20  y clause */..   
17be0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62     /* Create lab
17bf0 65 6c 73 20 74 68 61 74 20 77 65 20 77 69 6c 6c  els that we will
17c00 20 62 65 20 6e 65 65 64 69 6e 67 0a 20 20 20 20   be needing.    
17c10 20 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20    */.     .     
17c20 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
17c30 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
17c40 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
17c50 20 20 20 20 20 61 64 64 72 47 72 6f 75 70 42 79       addrGroupBy
17c60 43 68 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33  Change = sqlite3
17c70 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17c80 3b 0a 20 20 20 20 20 20 61 64 64 72 50 72 6f 63  ;.      addrProc
17c90 65 73 73 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  essRow = sqlite3
17ca0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
17cb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
17cc0 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
17cd0 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
17ce0 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
17cf0 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
17d00 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
17d10 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
17d20 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
17d30 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
17d40 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
17d50 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
17d60 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
17d70 74 68 65 20 4f 70 65 6e 56 69 72 74 75 61 6c 20  the OpenVirtual 
17d80 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20  instruction.    
17d90 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e    ** will be con
17da0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f  verted into a No
17db0 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20  op.  .      */. 
17dc0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
17dd0 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73  rtingIdx = pPars
17de0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
17df0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
17e00 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
17e10 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
17e20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
17e30 74 69 6e 67 49 64 78 20 3d 0a 20 20 20 20 20 20  tingIdx =.      
17e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
17e50 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  p3(v, OP_OpenVir
17e60 74 75 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73  tual, sAggInfo.s
17e70 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
17ea0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20  rtingColumn,.   
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
17ed0 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
17ee0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
17ef0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
17f00 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
17f10 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
17f20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
17f30 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
17f40 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
17f50 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
17f60 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
17f70 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ag = pParse->nMe
17f80 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  m++;.      iAMem
17f90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
17fa0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
17fb0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
17fc0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
17fd0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
17fe0 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
17ff0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
18000 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
18010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18020 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
18030 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
18040 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18050 74 28 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61  t((v, "# clear a
18060 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
18070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18080 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
18090 74 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  t, 0, iUseFlag);
180a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
180b0 6e 74 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61  nt((v, "# indica
180c0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
180d0 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
180e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
180f0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
18100 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
18110 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  p);..      /* Ge
18120 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
18130 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
18140 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
18150 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
18160 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
18170 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
18180 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
18190 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
181a0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
181b0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
181c0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
181d0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
181e0 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
181f0 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
18200 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
18210 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
18220 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
18230 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
18240 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
18250 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
18260 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
18270 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
18280 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
18290 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
182a0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
182b0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
182c0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
182d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
182e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
182f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
18300 49 6e 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  Int, 1, iAbortFl
18310 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
18320 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65  omment((v, "# se
18330 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
18340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18350 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
18360 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
18370 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
18380 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
18390 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
183a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
183b0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
183c0 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61  Pos, iUseFlag, a
183d0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b  ddrOutputRow+2);
183e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
183f0 6e 74 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62  nt((v, "# Groupb
18400 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
18410 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
18420 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18430 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
18440 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20  Return, 0, 0);. 
18450 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
18460 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
18470 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
18480 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
18490 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
184a0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
184b0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
184c0 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
184d0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
184e0 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
184f0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
18500 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
18510 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  0, pOrderBy,.   
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
18540 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
18550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18560 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72              addr
18570 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64  OutputRow+1, add
18580 72 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b  rSetAbort, aff);
18590 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
185a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
185b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
185c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
185d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
185e0 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
185f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
18600 28 76 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70  (v, "# end group
18610 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
18620 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
18630 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
18640 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
18650 6c 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75  l reset the grou
18660 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72  p-by accumulator
18670 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18680 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
18690 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
186a0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73  dr(v);.      res
186b0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
186c0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
186d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
186e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
186f0 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20  eturn, 0, 0);.. 
18700 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
18710 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
18720 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
18730 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
18740 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
18750 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
18760 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
18770 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
18780 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
18790 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
187a0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
187b0 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
187c0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
187d0 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
187e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
187f0 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
18800 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
18810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
18820 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18830 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e  eLabel(v, addrIn
18840 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20  itializeLoop);. 
18850 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18860 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
18870 62 2c 20 30 2c 20 61 64 64 72 52 65 73 65 74 29  b, 0, addrReset)
18880 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
18890 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
188a0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
188b0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47  ist, pWhere, &pG
188c0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69  roupBy);.      i
188d0 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
188e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
188f0 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70        if( pGroup
18900 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
18910 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
18920 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
18930 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
18940 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
18950 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
18960 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
18970 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 56 69  .  The OP_OpenVi
18980 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  rtual table will
18990 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
189a0 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
189b0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
189c0 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
189d0 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
189e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
189f0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
18a00 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
18a10 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
18a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18a30 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
18a40 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
18a50 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
18a60 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
18a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
18a80 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
18a90 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
18aa0 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
18ab0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
18ac0 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
18ad0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
18ae0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
18af0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
18b00 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
18b10 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
18b20 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
18b30 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
18b40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
18b50 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
18b60 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
18b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18b80 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
18b90 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
18ba0 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
18bb0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f          j = pGro
18bc0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20  upBy->nExpr+1;. 
18bd0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
18be0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
18bf0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
18c00 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
18c10 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
18c20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
18c30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18c40 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
18c50 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65  umn<j ) continue
18c60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18c70 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  pCol->iColumn<0 
18c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
18c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18ca0 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 43 6f  v, OP_Rowid, pCo
18cb0 6c 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  l->iTable, 0);. 
18cc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18ce0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18cf0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  OP_Column, pCol-
18d00 3e 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69  >iTable, pCol->i
18d10 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
18d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a     }.          j
18d30 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
18d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18d50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
18d60 65 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a  eRecord, j, 0);.
18d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18d80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
18d90 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  dxInsert, sAggIn
18da0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30  fo.sortingIdx, 0
18db0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18dc0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
18dd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
18de0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18df0 4f 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  OP_Sort, sAggInf
18e00 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
18e10 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
18e20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
18e30 22 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74  "# GROUP BY sort
18e40 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
18e50 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
18e60 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Idx = 1;.      }
18e70 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75  ..      /* Evalu
18e80 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
18e90 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61  GROUP BY terms a
18ea0 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20  nd store in b0, 
18eb0 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20  b1, b2....      
18ec0 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79  ** (b0 is memory
18ed0 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b   location iBMem+
18ee0 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31  0, b1 is iBMem+1
18ef0 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a  , and so forth).
18f00 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f        ** Then co
18f10 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
18f20 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
18f30 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f   against the GRO
18f40 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20  UP BY terms.    
18f50 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72    ** from the pr
18f60 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65  evious row curre
18f70 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61  ntly stored in a
18f80 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20  0, a1, a2....   
18f90 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
18fa0 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69  TopOfLoop = sqli
18fb0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
18fc0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
18fd0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
18fe0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
18ff0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
19000 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
19010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19020 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
19030 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  n, sAggInfo.sort
19040 69 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20  ingIdx, j);.    
19050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19060 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
19070 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
19080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19090 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
190a0 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
190b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
190c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
190d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
190e0 4d 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b  MemStore, iBMem+
190f0 6a 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  j, j<pGroupBy->n
19100 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d  Expr-1);.      }
19110 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72  .      for(j=pGr
19120 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20  oupBy->nExpr-1; 
19130 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
19140 20 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70      if( j<pGroup
19150 42 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  By->nExpr-1 ){. 
19160 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19170 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19180 4d 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a  MemLoad, iBMem+j
19190 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
191a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
191b0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
191c0 65 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c  emLoad, iAMem+j,
191d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
191e0 20 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   j==0 ){.       
191f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19200 64 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78  dOp(v, OP_Eq, 0x
19210 32 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73  200, addrProcess
19220 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Row);.        }e
19230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
19240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19250 76 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c  v, OP_Ne, 0x200,
19260 20 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e   addrGroupByChan
19270 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
19280 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19290 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
192a0 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
192b0 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f  o->aColl[j], P3_
192c0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
192d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
192e0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72  rate code that r
192f0 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  uns whenever the
19300 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65   GROUP BY change
19310 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e  s..      ** Chan
19320 67 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  ge in the GROUP 
19330 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
19340 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
19350 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
19360 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
19370 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
19380 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
19390 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
193a0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
193b0 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
193c0 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
193d0 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
193e0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
193f0 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
19400 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
19410 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
19420 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
19430 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
19440 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
19450 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
19460 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
19470 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
19480 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
19490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
194a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
194b0 61 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75  abel(v, addrGrou
194c0 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  pByChange);.    
194d0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72    for(j=0; j<pGr
194e0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b  oupBy->nExpr; j+
194f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
19500 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19510 4f 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65  OP_MemMove, iAMe
19520 6d 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  m+j, iBMem+j);. 
19530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
19540 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19550 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
19560 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
19570 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19580 28 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e  (v, "# output on
19590 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20  e row"));.      
195a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
195b0 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
195c0 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
195d0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
195e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
195f0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
19600 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
19610 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19620 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
19630 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
19640 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
19650 20 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74   reset accumulat
19660 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
19670 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
19680 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
19690 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
196a0 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
196b0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
196c0 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
196d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
196e0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
196f0 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20  drProcessRow);. 
19700 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
19710 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
19720 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
19730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19740 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
19750 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
19760 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19770 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
19780 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
19790 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
197a0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
197b0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
197c0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
197d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
197e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
197f0 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  OP_Next, sAggInf
19800 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
19810 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
19820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19830 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
19840 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
19850 20 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74      uncreateSort
19860 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
19870 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
19880 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19890 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
198a0 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
198b0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
198c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
198d0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
198e0 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  0, addrOutputRow
198f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
19900 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70  ment((v, "# outp
19910 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
19920 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  .      .    } /*
19930 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20   endif pGroupBy 
19940 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
19950 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
19960 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
19970 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
19980 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
19990 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  The.      ** pro
199a0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
199b0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
199c0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
199d0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a  ngle row.      *
199e0 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
199f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65     */.      rese
19a00 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
19a10 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
19a20 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
19a30 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
19a40 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
19a50 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  st, pWhere, 0);.
19a60 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
19a70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
19a80 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64  t_end;.      upd
19a90 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
19aa0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
19ab0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19ac0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
19ad0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
19ae0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
19af0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
19b00 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
19b10 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
19b20 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
19b30 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
19b40 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
19b50 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31  ving, addrEnd, 1
19b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19b70 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
19b80 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
19b90 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
19ba0 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
19bb0 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73 74             eDest
19bc0 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64  , iParm, addrEnd
19bd0 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b  , addrEnd, aff);
19be0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19bf0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19c00 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
19c10 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
19c20 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
19c30 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
19c40 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
19c50 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
19c60 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
19c70 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
19c80 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
19c90 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
19ca0 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
19cb0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
19cc0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
19cd0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
19ce0 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
19cf0 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
19d00 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
19d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19d20 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
19d30 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
19d40 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
19d50 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
19d60 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
19d70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19d80 2e 20 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65  .  So delete the
19d90 20 73 75 62 71 75 65 72 79 20 73 74 72 75 63 74   subquery struct
19da0 75 72 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ure from the par
19db0 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ent.  ** to prev
19dc0 65 6e 74 20 74 68 69 73 20 73 75 62 71 75 65 72  ent this subquer
19dd0 79 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61  y from being eva
19de0 6c 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64  luated again and
19df0 20 74 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20   to force the.  
19e00 2a 2a 20 74 68 65 20 75 73 65 20 6f 66 20 74 68  ** the use of th
19e10 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
19e20 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
19e30 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  arent ){.    ass
19e40 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
19e50 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54  rc->nSrc>parentT
19e60 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ab );.    assert
19e70 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d  ( pParent->pSrc-
19e80 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
19e90 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20  elect==p );.    
19ea0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19eb0 65 74 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72  ete(p);.    pPar
19ec0 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72  ent->pSrc->a[par
19ed0 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20  entTab].pSelect 
19ee0 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
19ef0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
19f00 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
19f10 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
19f20 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19f30 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
19f40 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
19f50 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
19f60 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
19f70 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
19f80 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
19f90 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
19fa0 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
19fb0 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
19fc0 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
19fd0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
19fe0 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
19ff0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
1a000 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
1a010 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
1a020 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  ct_end:.  sqlite
1a030 46 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43  Free(sAggInfo.aC
1a040 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ol);.  sqliteFre
1a050 65 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  e(sAggInfo.aFunc
1a060 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a070 7d 0a                                            }.