/ Hex Artifact Content
Login

Artifact 5b0ccd6688e61c0720efa45075a3f9da60180554:


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 38 33  select.c,v 1.283
0200: 20 32 30 30 36 2f 30 31 2f 30 33 20 31 35 3a 31   2006/01/03 15:1
0210: 36 3a 32 36 20 64 72 68 20 45 78 70 20 24 0a 2a  6:26 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 28 63 68 61  te3StrNICmp((cha
0d50: 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  r*)p->z, keyword
0d60: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
0d70: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
0d80: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
0d90: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
0da0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
0db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0dc0: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
0dd0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0de0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
0df0: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
0e00: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
0e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0e20: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
0e30: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
0e40: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
0e50: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
0e60: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
0e70: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
0e80: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
0e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
0ea0: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
0eb0: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
0ec0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0ed0: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
0ee0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
0ef0: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
0f00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0f10: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
0f20: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0f30: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
0f40: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
0f50: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
0f60: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
0f70: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
0f90: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
0fa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0fb0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0fc0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
0fd0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
0fe0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
0ff0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
1000: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1010: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1020: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1040: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1050: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1060: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1070: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1080: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1090: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
10a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
10b0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
10c0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
10d0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
10e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1100: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1110: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1120: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1130: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1150: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
1160: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
1170: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1180: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1190: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
11a0: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
11b0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
11c0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28   *z){.  p->z = (
11d0: 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20  u8*)z;.  p->n = 
11e0: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
11f0: 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  0;.  p->dyn = 0;
1200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1210: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
1220: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
1230: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1240: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
1250: 73 74 61 74 69 63 20 45 78 70 72 20 2a 63 72 65  static Expr *cre
1260: 61 74 65 49 64 45 78 70 72 28 63 6f 6e 73 74 20  ateIdExpr(const 
1270: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1280: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73  Token dummy;.  s
1290: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
12a0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
12b0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
12c0: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
12d0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
12e0: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
12f0: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
1300: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
1310: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
1320: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
1330: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
1340: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
1350: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1360: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1370: 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20  reTerm(.  const 
1380: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20  char *zCol,     
1390: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13a0: 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
13b0: 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31  nst Table *pTab1
13c0: 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ,      /* First 
13d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
13e0: 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20   char *zAlias1, 
13f0: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
1400: 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d   first table.  M
1410: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1420: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
1430: 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  b2,      /* Seco
1440: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  nd table */.  co
1450: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
1460: 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  2,     /* Alias 
1470: 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65  for second table
1480: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1490: 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a 6f  /.  int iRightJo
14a0: 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a 20  inTable,     /* 
14b0: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
14c0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
14d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
14e0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
14f0: 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69 74   Add the equalit
1500: 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65  y term to this e
1510: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
1520: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1530: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1540: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1550: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1560: 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 63 72  pE;..  pE1a = cr
1570: 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29  eateIdExpr(zCol)
1580: 3b 0a 20 20 70 45 32 61 20 3d 20 63 72 65 61 74  ;.  pE2a = creat
1590: 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20  eIdExpr(zCol);. 
15a0: 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20   if( zAlias1==0 
15b0: 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d  ){.    zAlias1 =
15c0: 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab1->zName;. 
15d0: 20 7d 0a 20 20 70 45 31 62 20 3d 20 63 72 65 61   }.  pE1b = crea
15e0: 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 31  teIdExpr(zAlias1
15f0: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
1600: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1610: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1620: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1630: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c  createIdExpr(zAl
1640: 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20  ias2);.  pE1c = 
1650: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
1660: 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20  OT, pE1b, pE1a, 
1670: 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c  0);.  pE2c = sql
1680: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
1690: 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b   pE2b, pE2a, 0);
16a0: 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45  .  pE = sqlite3E
16b0: 78 70 72 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c  xpr(TK_EQ, pE1c,
16c0: 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 45 78 70   pE2c, 0);.  Exp
16d0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
16e0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
16f0: 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54   pE->iRightJoinT
1700: 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69  able = iRightJoi
1710: 6e 54 61 62 6c 65 3b 0a 20 20 2a 70 70 45 78 70  nTable;.  *ppExp
1720: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
1730: 6e 64 28 2a 70 70 45 78 70 72 2c 20 70 45 29 3b  nd(*ppExpr, pE);
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1750: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1760: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
1770: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
1780: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1790: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
17a0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
17b0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
17c0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
17d0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
17e0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
17f0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
1800: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
1810: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1820: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
1830: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1840: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
1850: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
1860: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
1870: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
1880: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
1890: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
18a0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
18b0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
18c0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
18d0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
18e0: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
18f0: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
1900: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
1910: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
1920: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
1930: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1940: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
1950: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
1960: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
1970: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
1980: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
1990: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
19a0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
19b0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
19c0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
19d0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
19e0: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
19f0: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
1a00: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
1a10: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1a20: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
1a30: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
1a40: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
1a50: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
1a60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
1a70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1a80: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1a90: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
1aa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
1ab0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
1ac0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
1ad0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
1ae0: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
1af0: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
1b00: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
1b10: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
1b20: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
1b30: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
1b40: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
1b50: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
1b60: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
1b70: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
1b80: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
1b90: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
1ba0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
1bb0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
1bc0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
1bd0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
1be0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
1bf0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
1c00: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
1c10: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
1c20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
1c30: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
1c40: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
1c50: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
1c60: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69  mJoin);.    p->i
1c70: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c80: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74   iTable;.    set
1c90: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
1ca0: 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, iTable);.    
1cb0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
1cc0: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
1cd0: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
1ce0: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
1cf0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
1d00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1d10: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
1d20: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
1d30: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
1d40: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
1d50: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
1d60: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
1d70: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
1d80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1d90: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ms..**.** The te
1da0: 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  rms of a FROM cl
1db0: 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e  ause are contain
1dc0: 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74  ed in the Select
1dd0: 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e  .pSrc structure.
1de0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73  .** The left mos
1df0: 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66  t table is the f
1e00: 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65  irst entry in Se
1e10: 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20  lect.pSrc.  The 
1e20: 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61  right-most.** ta
1e30: 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20  ble is the last 
1e40: 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e  entry.  The join
1e50: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c   operator is hel
1e60: 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  d in the entry t
1e70: 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20  o.** the left.  
1e80: 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e  Thus entry 0 con
1e90: 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f  tains the join o
1ea0: 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  perator for the 
1eb0: 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  join between.** 
1ec0: 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e  entries 0 and 1.
1ed0: 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e    Any ON or USIN
1ee0: 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69  G clauses associ
1ef0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f  ated with the jo
1f00: 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61  in are.** also a
1f10: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1f20: 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  eft entry..**.**
1f30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1f40: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1f50: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
1f60: 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ntered..*/.stati
1f70: 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63  c int sqliteProc
1f80: 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70  essJoin(Parse *p
1f90: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1fa0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1fb0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1fc0: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c       /* All tabl
1fd0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
1fe0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1ff0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2010: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2020: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2030: 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20  item *pLeft;    
2040: 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62   /* Left table b
2050: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
2060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2070: 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20  item *pRight;   
2080: 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20   /* Right table 
2090: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
20a0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
20b0: 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53  c;.  pLeft = &pS
20c0: 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67  rc->a[0];.  pRig
20d0: 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a  ht = &pLeft[1];.
20e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
20f0: 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20  c->nSrc-1; i++, 
2100: 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b  pRight++, pLeft+
2110: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2120: 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d  LeftTab = pLeft-
2130: 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65  >pTab;.    Table
2140: 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52   *pRightTab = pR
2150: 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  ight->pTab;..   
2160: 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30   if( pLeftTab==0
2170: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
2180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2190: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
21a0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
21b0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
21c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
21d0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
21e0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
21f0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2200: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2210: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66   */.    if( pLef
2220: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2230: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
2240: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e    if( pLeft->pOn
2250: 20 7c 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e   || pLeft->pUsin
2260: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
2270: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2280: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
2290: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
22a0: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
22b0: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
22c0: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
22d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
22f0: 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d  j=0; j<pLeftTab-
2300: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
2310: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2320: 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f   = pLeftTab->aCo
2330: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
2340: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2350: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
2360: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
2370: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2380: 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  rm(zName, pLeftT
2390: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
23a0: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
23d0: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
2400: 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e  t->iCursor, &p->
2410: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
2420: 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20     .        }.  
2430: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2440: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
2450: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
2460: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2470: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
2480: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
2490: 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70 55 73 69  n && pLeft->pUsi
24a0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
24b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24c0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
24d0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
24e0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
24f0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2500: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
2510: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2520: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
2530: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
2540: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2550: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
2560: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
2570: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2580: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2590: 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  eft->pOn ){.    
25a0: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c    setJoinExpr(pL
25b0: 65 66 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  eft->pOn, pRight
25c0: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
25d0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
25e0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e  lite3ExprAnd(p->
25f0: 70 57 68 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70  pWhere, pLeft->p
2600: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  On);.      pLeft
2610: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
2620: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2630: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
2640: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2650: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
2660: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
2670: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2680: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
2690: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
26a0: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
26b0: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
26c0: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
26d0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
26e0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
26f0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
2700: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
2710: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
2720: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
2730: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
2740: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
2750: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
2760: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
2770: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
2780: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
2790: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
27a0: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
27b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
27c0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
27d0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
27e0: 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b  = pLeft->pUsing;
27f0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2800: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
2810: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2820: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d   *zName = pList-
2830: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
2840: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
2850: 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a  ndex(pLeftTab, z
2860: 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d  Name)<0 || colum
2870: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2880: 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20  , zName)<0 ){.  
2890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28b0: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
28c0: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
28d0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
28e0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
28f0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
2900: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2910: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2930: 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61  addWhereTerm(zNa
2940: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2950: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2980: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
2990: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
29c0: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
29d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
29f0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2a00: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
2a10: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
2a20: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
2a30: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2a40: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2a50: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
2a60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2a70: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  n;.  sqlite3Expr
2a80: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2a90: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2aa0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2ab0: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
2ac0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2ad0: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
2ae0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2af0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
2b00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2b10: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
2b20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b30: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
2b40: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
2b50: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
2b60: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
2b70: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
2b80: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
2b90: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
2ba0: 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  ffset);.  sqlite
2bb0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2bc0: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e  * Insert code in
2bd0: 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c  to "v" that will
2be0: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
2bf0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
2c00: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f  he.** stack into
2c10: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
2c20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
2c30: 4f 6e 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65  OntoSorter(Parse
2c40: 20 2a 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a   *pParse, Vdbe *
2c50: 76 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  v, ExprList *pOr
2c60: 64 65 72 42 79 29 7b 0a 20 20 73 71 6c 69 74 65  derBy){.  sqlite
2c70: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2c80: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
2c90: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  By);.  sqlite3Vd
2ca0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65  beAddOp(v, OP_Se
2cb0: 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79  quence, pOrderBy
2cc0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
2cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ce0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70  Op(v, OP_Pull, p
2cf0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b  OrderBy->nExpr +
2d00: 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   1, 0);.  sqlite
2d10: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2d20: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72  _MakeRecord, pOr
2d30: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32  derBy->nExpr + 2
2d40: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
2d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
2d60: 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72  dxInsert, pOrder
2d70: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29  By->iECursor, 0)
2d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  ;.}../*.** Add c
2d90: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
2da0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
2db0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
2dc0: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
2dd0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
2de0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
2df0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
2e00: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
2e10: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2e20: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2e30: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
2e40: 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75  ntinue,    /* Ju
2e50: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
2e60: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
2e70: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70  rd */.  int nPop
2e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e90: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 6f 20  ber of times to 
2ea0: 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e 20 6a  pop stack when j
2eb0: 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  umping */.){.  i
2ec0: 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30  f( p->iOffset>=0
2ed0: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
2ee0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
2ef0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2f00: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33  rrentAddr(v) + 3
2f10: 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70 3e 30  ;.    if( nPop>0
2f20: 20 29 20 61 64 64 72 2b 2b 3b 0a 20 20 20 20 73   ) addr++;.    s
2f30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2f40: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70  v, OP_MemIncr, p
2f50: 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  ->iOffset, 0);. 
2f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f70: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
2f80: 6f 73 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  os, p->iOffset, 
2f90: 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  addr);.    if( n
2fa0: 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  Pop>0 ){.      s
2fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2fc0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c  v, OP_Pop, nPop,
2fd0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2fe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2ff0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3000: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3010: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3020: 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65  # skip OFFSET re
3030: 63 6f 72 64 73 22 29 29 3b 0a 20 20 7d 0a 7d 0a  cords"));.  }.}.
3040: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3050: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
3060: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
3070: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
3080: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
3090: 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69  are distinct.  i
30a0: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
30b0: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
30c0: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
30d0: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
30e0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
30f0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3100: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
3110: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
3120: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
3130: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
3140: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
3150: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4b  s made and the K
3160: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
3170: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
3180: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
3190: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
31a0: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
31b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
31c0: 44 69 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65  Distinct(.  Vdbe
31d0: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *v,           /
31e0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
31f0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3200: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
3210: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
3220: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
3230: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
3240: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
3250: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
3260: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
3270: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
3280: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
3290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70        /* The top
32a0: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74   N elements of t
32b0: 68 65 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65  he stack must be
32c0: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
32d0: 6e 74 20 4b 20 20 20 20 20 20 20 20 20 20 20 20  nt K            
32e0: 20 20 2f 2a 20 50 6f 70 20 4b 20 65 6c 65 6d 65    /* Pop K eleme
32f0: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
3300: 63 6b 20 69 66 20 69 6e 64 69 73 74 69 6e 63 74  ck if indistinct
3310: 20 2a 2f 0a 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f   */.){.#if NULL_
3320: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a  ALWAYS_DISTINCT.
3330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3340: 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  Op(v, OP_IsNull,
3350: 20 2d 4e 2c 20 73 71 6c 69 74 65 33 56 64 62 65   -N, sqlite3Vdbe
3360: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 36  CurrentAddr(v)+6
3370: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
3380: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3390: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d  OP_MakeRecord, -
33a0: 4e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  N, 0);.  sqlite3
33b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
33c0: 44 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20  Distinct, iTab, 
33d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33e0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
33f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3400: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30  (v, OP_Pop, K, 0
3410: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3420: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
3430: 2c 20 30 2c 20 61 64 64 72 52 65 70 65 61 74 29  , 0, addrRepeat)
3440: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
3450: 28 76 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69  (v, "# skip indi
3460: 73 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29  stinct records")
3470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
3490: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b  nsert, iTab, 0);
34a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
34b0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
34c0: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
34d0: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
34e0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
34f0: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
3500: 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20  * If srcTab and 
3510: 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68  nColumn are both
3520: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
3530: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
3540: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
3550: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
3560: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
3570: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e   this row.  If n
3580: 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e  Column>0.** then
3590: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
35a0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
35b0: 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f  pEList is used o
35c0: 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a  nly to get the.*
35d0: 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20  * datatypes for 
35e0: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
35f0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
3600: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
3610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3620: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
3630: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
3640: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
3650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3660: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
3670: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
3680: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
3690: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
36a0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
36b0: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
36c0: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
36d0: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
36e0: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
36f0: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
3700: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3720: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
3730: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
3740: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
3750: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
3760: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
3770: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
3780: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
3790: 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c  .  int distinct,
37a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
37b0: 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20   >=0, make sure 
37c0: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
37d0: 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  inct */.  int eD
37e0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
37f0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
3800: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
3810: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
3820: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
3830: 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74  /* An argument t
3840: 6f 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d  o the disposal m
3850: 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ethod */.  int i
3860: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
3870: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3880: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
3890: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
38a0: 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20  nt iBreak,      
38b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
38c0: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
38d0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
38e0: 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  op */.  char *af
38f0: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
3900: 2f 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  /* affinity stri
3910: 6e 67 20 69 66 20 65 44 65 73 74 20 69 73 20 53  ng if eDest is S
3920: 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  RT_Union */.){. 
3930: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
3940: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
3950: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
3960: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
3970: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
3980: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
3990: 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66  present */..  if
39a0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
39b0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  0;.  assert( pEL
39c0: 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ist!=0 );..  /* 
39d0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c  If there was a L
39e0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74  IMIT clause on t
39f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3a00: 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ent, then do the
3a10: 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   check.  ** to s
3a20: 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73  ee if this row s
3a30: 68 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e  hould be output.
3a40: 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69  .  */.  hasDisti
3a50: 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d  nct = distinct>=
3a60: 30 20 26 26 20 70 45 4c 69 73 74 20 26 26 20 70  0 && pEList && p
3a70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a  EList->nExpr>0;.
3a80: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
3a90: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
3aa0: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
3ab0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
3ac0: 6e 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nue, 0);.  }..  
3ad0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
3ae0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
3af0: 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d   */.  if( nColum
3b00: 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  n>0 ){.    for(i
3b10: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
3b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3b30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3b40: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
3b50: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , i);.    }.  }e
3b60: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  lse{.    nColumn
3b70: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
3b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
3b90: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
3ba0: 61 72 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  arse, pEList);. 
3bb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
3bc0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
3bd0: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
3be0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
3bf0: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
3c00: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
3c10: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
3c20: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
3c30: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
3c40: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
3c50: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
3c60: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 69 6e  stinct ){.    in
3c70: 74 20 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  t n = pEList->nE
3c80: 78 70 72 3b 0a 20 20 20 20 63 6f 64 65 44 69 73  xpr;.    codeDis
3c90: 74 69 6e 63 74 28 76 2c 20 64 69 73 74 69 6e 63  tinct(v, distinc
3ca0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 2c  t, iContinue, n,
3cb0: 20 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70   n+1);.    if( p
3cc0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
3cd0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
3ce0: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  , p, iContinue, 
3cf0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a  nColumn);.    }.
3d00: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
3d10: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
3d20: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
3d30: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
3d40: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
3d50: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
3d60: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
3d70: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
3d80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3d90: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
3da0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
3db0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  on: {.      sqli
3dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3dd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3de0: 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57  Column, NULL_ALW
3df0: 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20  AYS_DISTINCT);. 
3e00: 20 20 20 20 20 69 66 28 20 61 66 66 20 29 7b 0a       if( aff ){.
3e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3e20: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
3e30: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
3e40: 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
3e50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3e60: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
3e70: 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  rt, iParm, 0);. 
3e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3e90: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
3ea0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
3eb0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
3ec0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
3ed0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
3ee0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
3ef0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
3f00: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
3f10: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
3f20: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
3f30: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
3f40: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
3f50: 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  pt: {.      int 
3f60: 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72  addr;.      addr
3f70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3f80: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3f90: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
3fa0: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3fb0: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
3fc0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3fd0: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53  v, -1, aff, P3_S
3fe0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
3ff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4000: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69  , OP_NotFound, i
4010: 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20  Parm, addr+3);. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4030: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65  AddOp(v, OP_Dele
4040: 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  te, iParm, 0);. 
4050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4060: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
4070: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
4080: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
4090: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
40a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
40b0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
40c0: 65 20 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  e SRT_VirtualTab
40d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
40e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
40f0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4100: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4110: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
4120: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4130: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76  Sorter(pParse, v
4140: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
4150: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4170: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
4180: 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  d, iParm, 0);.  
4190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
41a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
41b0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
41c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
41d0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
41e0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
41f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4200: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
4210: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4220: 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
4230: 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
4240: 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
4250: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
4260: 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
4270: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
4280: 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
4290: 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
42a0: 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
42b0: 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
42c0: 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
42d0: 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
42e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
42f0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
4300: 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
4310: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4320: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
4330: 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20  int addr2;..    
4340: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
4350: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
4360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4370: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
4380: 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20  , addr1+3);.    
4390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
43a0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
43b0: 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32   0);.      addr2
43c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
43d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
43e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
43f0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4400: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
4410: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
4420: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
4430: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
4440: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
4450: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
4460: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
4470: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
4480: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
4490: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
44a0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
44b0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
44c0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
44d0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
44e0: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
44f0: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
4500: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4510: 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72  r(pParse, v, pOr
4520: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65  derBy);.      }e
4530: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
4540: 72 20 61 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e  r aff = (iParm>>
4550: 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20 20  16)&0xFF;.      
4560: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43    aff = sqlite3C
4570: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
4580: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
4590: 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  r, aff);.       
45a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
45b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
45c0: 2c 20 31 2c 20 30 2c 20 26 61 66 66 2c 20 31 29  , 1, 0, &aff, 1)
45d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
45e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
45f0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61  _IdxInsert, (iPa
4600: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
4610: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4630: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
4640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4650: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
4660: 6e 79 20 72 6f 77 20 65 78 69 73 74 73 20 69 6e  ny row exists in
4670: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
4680: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
4690: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
46a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
46b0: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
46c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
46d0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
46e0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
46f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4700: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4710: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4720: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
4730: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
4740: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
4750: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
4760: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4770: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
4780: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
4790: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
47a0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
47b0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
47c0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
47d0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
47e0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
47f0: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4800: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
4810: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4820: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
4830: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4840: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
4850: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4860: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4870: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4880: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4890: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
48a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
48b0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
48c0: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
48d0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
48e0: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
48f0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4900: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
4910: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4920: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
4930: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4940: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
4950: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
4960: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
4970: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
4980: 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
4990: 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
49a0: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
49b0: 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
49c0: 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
49d0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
49e0: 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
49f0: 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
4a00: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
4a10: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
4a20: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
4a30: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b   SRT_Callback: {
4a40: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4a50: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4a60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4a70: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4a80: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4a90: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4aa0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 76 2c  orter(pParse, v,
4ab0: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
4ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
4ad0: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
4ae0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
4af0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4b00: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
4b10: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
4b20: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4b30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4b40: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4b50: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4b60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4b70: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
4b80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
4b90: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
4ba0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4bb0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4bc0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4bd0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4be0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4bf0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4c00: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
4c10: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
4c20: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
4c30: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
4c40: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
4c50: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
4c60: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4c70: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4c80: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4c90: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4ca0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4cb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4cc0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4cd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4ce0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4cf0: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4d00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4d10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4d20: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
4d30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
4d40: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
4d50: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
4d60: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
4d70: 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
4d80: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4d90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4da0: 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d  MemIncr, p->iLim
4db0: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
4dc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4dd0: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d  OP_IfMemZero, p-
4de0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
4df0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4e10: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
4e20: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
4e30: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4e40: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
4e50: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
4e60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
4e70: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
4e80: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
4e90: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
4ea0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
4eb0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
4ec0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
4ed0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
4ee0: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
4ef0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
4f00: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
4f10: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
4f20: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
4f30: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
4f40: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
4f50: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
4f60: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
4f70: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
4f80: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
4f90: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
4fa0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
4fb0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
4fc0: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
4fd0: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
4fe0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
4ff0: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
5000: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
5010: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
5020: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
5030: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
5040: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
5050: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
5060: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
5070: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
5080: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
5090: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
50a0: 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61  he P3 field of a
50b0: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
50c0: 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P3_KEYINFO_HAN
50d0: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
50e0: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
50f0: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
5100: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
5110: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5120: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
5130: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
5140: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
5150: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5160: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
5170: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
5180: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
5190: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
51a0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
51b0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
51c0: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
51d0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
51e0: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
51f0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
5200: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
5210: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
5220: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5230: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
5240: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
5250: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
5260: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
5270: 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a 20 20  nc = db->enc;.  
5280: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
5290: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
52a0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
52b0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
52c0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
52d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
52e0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
52f0: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
5300: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
5310: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
5320: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
5330: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
5340: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
5350: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
5360: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
5370: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
5380: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
5390: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
53a0: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
53b0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
53c0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
53d0: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
53e0: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
53f0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
5400: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
5410: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
5420: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
5430: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
5440: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
5450: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
5460: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
5470: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
5480: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
5490: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
54a0: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
54b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
54c0: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
54d0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
54e0: 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72  se,   /* The par
54f0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5500: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5510: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
5520: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
5530: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
5540: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5550: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
5560: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
5570: 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n,     /* Number
5580: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
5590: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ata */.  int eDe
55a0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  st,       /* Wri
55b0: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
55c0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
55d0: 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20  int iParm       
55e0: 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72   /* Optional par
55f0: 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65  ameter associate
5600: 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a  d with eDest */.
5610: 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73  ){.  int brk = s
5620: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5630: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f  bel(v);.  int co
5640: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
5650: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
5660: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
5670: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
5680: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
5690: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61  pOrderBy;..  iTa
56a0: 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  b = pOrderBy->iE
56b0: 43 75 72 73 6f 72 3b 0a 20 20 61 64 64 72 20 3d  Cursor;.  addr =
56c0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
56d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
56e0: 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20  , iTab, brk);.  
56f0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
5700: 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c   cont, 0);.  sql
5710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5720: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
5730: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
5740: 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68  r + 1);.  switch
5750: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
5760: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
5770: 20 20 20 63 61 73 65 20 53 52 54 5f 56 69 72 74     case SRT_Virt
5780: 75 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  ualTab: {.      
5790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57a0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
57b0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
57c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
57d0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
57e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
57f0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5800: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
5810: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5820: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
5830: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5840: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
5850: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5860: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5870: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
5880: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5890: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
58a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
58b0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
58c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
58d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
58e0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
58f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5900: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
5910: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5920: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
5930: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
5940: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5950: 2c 20 31 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f  , 1, 0, "c", P3_
5960: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
5970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5980: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5990: 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46   (iParm&0x0000FF
59a0: 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  FF), 0);.      b
59b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
59c0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
59d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
59e0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
59f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a00: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
5a10: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
5a20: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5a30: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
5a40: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
5a50: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
5a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5a70: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
5a80: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
5a90: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
5aa0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
5ab0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
5ac0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5ad0: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69  Integer, p->pELi
5ae0: 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  st->nExpr, 0);. 
5af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5b00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
5b10: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 1, 0);.      f
5b20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
5b30: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
5b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5b50: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
5b60: 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20  -1-i, i);.      
5b70: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
5b80: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
5b90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5ba0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5bb0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
5bc0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
5bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5be0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5bf0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
5c00: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
5c10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
5c30: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   2, 0);.      br
5c40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5c50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5c60: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
5c70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5c80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
5c90: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
5ca0: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74   the loop when t
5cb0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
5cc0: 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  hed.  */.  if( p
5cd0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
5ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5cf0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
5d00: 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29  r, p->iLimit, 0)
5d10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5d20: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
5d30: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
5d40: 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20  t, brk);.  }..  
5d50: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
5d60: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
5d70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
5d80: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
5d90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5da0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
5db0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
5dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
5dd0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29  lveLabel(v, brk)
5de0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5df0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5e00: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
5e10: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
5e20: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
5e30: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5e40: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
5e50: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
5e60: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
5e70: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
5e80: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
5e90: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
5ea0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
5eb0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
5ec0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
5ed0: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
5ee0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
5ef0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5f00: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
5f10: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
5f20: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
5f30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
5f40: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
5f50: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
5f60: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5f70: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
5f80: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
5f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5fa0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
5fb0: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
5fc0: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
5fd0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
5fe0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
5ff0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
6000: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
6010: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
6020: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
6030: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
6040: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
6050: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
6060: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
6070: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
6080: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
6090: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
60a0: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
60b0: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
60c0: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
60d0: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
60e0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
60f0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
6100: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
6110: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
6120: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
6130: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
6140: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
6150: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
6160: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
6170: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
6180: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
6190: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
61a0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
61b0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
61c0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
61d0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
61e0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
61f0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
6200: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
6210: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
6220: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
6230: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
6240: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
6250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6260: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
6270: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
6280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6290: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
62a0: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
62b0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
62c0: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
62d0: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
62e0: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
62f0: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
6300: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
6310: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
6320: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
6330: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
6340: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
6350: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
6360: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
6370: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
6380: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
6390: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
63a0: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
63b0: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
63c0: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
63d0: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
63e0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
63f0: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
6400: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
6410: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
6420: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
6430: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
6440: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
6450: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
6460: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
6470: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
6480: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
6490: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
64a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
64b0: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
64c0: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
64d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
64e0: 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a  assert( pTab );.
64f0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
6500: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
6510: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
6520: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
6530: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
6540: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
6550: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
6560: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
6570: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
6580: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6590: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
65a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
65b0: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
65c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
65d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
65e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
65f0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
6600: 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e   {.      NameCon
6610: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
6620: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
6630: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
6640: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
6650: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
6660: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
6670: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
6680: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
6690: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53  umnType(&sNC, pS
66a0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
66b0: 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72  Expr); .      br
66c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
66d0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  f.    default:. 
66e0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
66f0: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
6700: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
6710: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
6720: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
6730: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
6740: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
6750: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
6760: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
6770: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
6780: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
6790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
67a0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
67b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
67c0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
67d0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
67e0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
67f0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
6800: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
6810: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
6820: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
6830: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
6840: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
6850: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
6860: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
6870: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f  = pTabList;.  fo
6880: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
6890: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
68a0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
68b0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
68c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
68d0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
68e0: 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20  pe(&sNC, p);.   
68f0: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
6900: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a  continue;.    /*
6910: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
6920: 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70  ake it's own cop
6930: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
6940: 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68  type, in case th
6950: 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  e .    ** schema
6960: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
6970: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
6980: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
6990: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
69a0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
69b0: 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e  me(v, i+pEList->
69c0: 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74  nExpr, zType, st
69d0: 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20  rlen(zType));.  
69e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
69f0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
6a00: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
6a10: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
6a20: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
6a30: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
6a40: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
6a50: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
6a60: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
6a70: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
6a80: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
6a90: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
6aa0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
6ab0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6ac0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
6ad0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
6ae0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
6af0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
6b00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
6b10: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
6b20: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
6b30: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
6b40: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
6b50: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6b60: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
6b70: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6b80: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
6b90: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
6ba0: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
6bb0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6bc0: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
6bd0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
6be0: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
6bf0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
6c00: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
6c10: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
6c20: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
6c30: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
6c40: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
6c50: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 54  v==0 || sqlite3T
6c60: 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
6c70: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
6c80: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
6c90: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
6ca0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
6cb0: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
6cc0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
6cd0: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
6ce0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
6cf0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
6d00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
6d10: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
6d20: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
6d30: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
6d40: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6d50: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
6d60: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
6d70: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
6d80: 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  p==0 ) continue;
6d90: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
6da0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
6db0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
6dc0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
6dd0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  zName;.      sql
6de0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6df0: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
6e00: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a  strlen(zName));.
6e10: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
6e20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
6e30: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
6e40: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
6e50: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
6e60: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
6e70: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
6e80: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
6e90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6ea0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
6eb0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
6ec0: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54  ].iCursor!=p->iT
6ed0: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
6ee0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
6ef0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
6f00: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
6f10: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
6f20: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
6f30: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
6f40: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
6f50: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
6f60: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
6f70: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
6f80: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
6f90: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
6fa0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
6fb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6fc0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
6fd0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
6fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6ff0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
7000: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26 26  && !fullNames &&
7010: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
7020: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
7030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7040: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7050: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
7060: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
7070: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7080: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73  fullNames || (!s
7090: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61  hortNames && pTa
70a0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
70b0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
70c0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
70d0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
70e0: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
70f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  pTabList->a[j].z
7100: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69  Alias;.        i
7110: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
7120: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
7130: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
7140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
7150: 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a  String(&zName, z
7160: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
7170: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
7180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7190: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
71a0: 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43  Name, P3_DYNAMIC
71b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
71c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
71d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
71e0: 20 69 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e   i, zCol, strlen
71f0: 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (zCol));.      }
7200: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
7210: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
7220: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
7230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
7240: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 28 63  ColName(v, i, (c
7250: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20  har*)p->span.z, 
7260: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
7270: 20 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65    /* sqlite3Vdbe
7280: 43 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c  CompressSpace(v,
7290: 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d   addr); */.    }
72a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
72b0: 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20   zName[30];.    
72c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
72d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54  =TK_COLUMN || pT
72e0: 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  abList==0 );.   
72f0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65     sprintf(zName
7300: 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b  , "column%d", i+
7310: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
7320: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7330: 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  v, i, zName, 0);
7340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
7350: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
7360: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
7370: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
7380: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7390: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
73a0: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
73b0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
73c0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
73d0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
73e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
73f0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
7400: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
7410: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
7420: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
7430: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
7440: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
7450: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
7460: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
7470: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
7480: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
7490: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
74a0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
74b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
74c0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
74d0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
74e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
74f0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
7500: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7510: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7520: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
7530: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
7540: 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
7550: 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  t prepSelectStmt
7560: 28 50 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a  (Parse*, Select*
7570: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  );../*.** Given 
7580: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
7590: 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54  nt, generate a T
75a0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
75b0: 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a  hat describes.**
75c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
75d0: 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a  of that SELECT..
75e0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
75f0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
7600: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
7610: 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  , char *zTabName
7620: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
7630: 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  t){.  Table *pTa
7640: 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  b;.  int i, j;. 
7650: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
7660: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
7670: 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28  l, *pCol;..  if(
7680: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
7690: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
76a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
76b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
76c0: 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65  te3SelectResolve
76d0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
76e0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
76f0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
7700: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7710: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
7720: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
7730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7740: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52 65  .  }.  pTab->nRe
7750: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
7760: 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65 20  Name = zTabName 
7770: 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  ? sqliteStrDup(z
7780: 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20  TabName) : 0;.  
7790: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
77a0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62  ->pEList;.  pTab
77b0: 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ->nCol = pEList-
77c0: 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  >nExpr;.  assert
77d0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
77e0: 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d  ;.  pTab->aCol =
77f0: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d 61   aCol = sqliteMa
7800: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54 61  lloc( sizeof(pTa
7810: 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61 62  b->aCol[0])*pTab
7820: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72 28  ->nCol );.  for(
7830: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
7840: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
7850: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
7860: 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20 20  Expr *p, *pR;.  
7870: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
7880: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
7890: 20 20 20 20 63 68 61 72 20 2a 7a 42 61 73 65 6e      char *zBasen
78a0: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ame;.    int cnt
78b0: 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  ;.    NameContex
78c0: 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20  t sNC;.    .    
78d0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
78e0: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
78f0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
7900: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
7910: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
7920: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
7930: 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ht==0 || p->pRig
7940: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c  ht->token.z==0 |
7950: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
7960: 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  en.z[0]!=0 );.  
7970: 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70    if( (zName = p
7980: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
7990: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  e)!=0 ){.      /
79a0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
79b0: 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20  contains an "AS 
79c0: 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20  <name>" phrase, 
79d0: 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68  use <name> as th
79e0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
79f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
7a00: 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rDup(zName);.   
7a10: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70   }else if( p->op
7a20: 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20  ==TK_DOT .      
7a30: 20 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70          && (pR=p
7a40: 2d 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20  ->pRight)!=0 && 
7a50: 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70  pR->token.z && p
7a60: 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b  R->token.z[0] ){
7a70: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  .      /* For co
7a80: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f  lumns of the fro
7a90: 6d 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74  m A.B use B as t
7aa0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
7ab0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7ac0: 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70  MPrintf("%T", &p
7ad0: 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d  R->token);.    }
7ae0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
7af0: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
7b00: 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  0] ){.      /* U
7b10: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
7b20: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
7b30: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
7b40: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
7b50: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7b60: 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20  e3MPrintf("%T", 
7b70: 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  &p->span);.    }
7b80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
7b90: 66 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73  f all else fails
7ba0: 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65  , make up a name
7bb0: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
7bc0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7bd0: 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31  ("column%d", i+1
7be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7bf0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
7c00: 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e);.    if( sqli
7c10: 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
7c20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
7c30: 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65  sqliteFree(zName
7c40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7c50: 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70  DeleteTable(0, p
7c60: 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Tab);.      retu
7c70: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
7c80: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
7c90: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
7ca0: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
7cb0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
7cc0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
7cd0: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
7ce0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
7cf0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
7d00: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  ue..    */.    z
7d10: 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Basename = zName
7d20: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
7d30: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
7d40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
7d50: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
7d60: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
7d70: 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  ){.        zName
7d80: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
7d90: 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73 65  f("%s:%d", zBase
7da0: 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  name, ++cnt);.  
7db0: 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20        j = -1;.  
7dc0: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d        if( zName=
7dd0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7de0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7df0: 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61  ( zBasename!=zNa
7e00: 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  me ){.      sqli
7e10: 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61 6d 65  teFree(zBasename
7e20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  );.    }.    pCo
7e30: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
7e40: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  ;..    /* Get th
7e50: 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65  e typename, type
7e60: 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63   affinity, and c
7e70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
7e80: 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
7e90: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
7ea0: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
7eb0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
7ec0: 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
7ed0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
7ee0: 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  rc;.    zType = 
7ef0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c  sqliteStrDup(col
7f00: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 29  umnType(&sNC, p)
7f10: 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  );.    pCol->zTy
7f20: 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20  pe = zType;.    
7f30: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
7f40: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
7f50: 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f  nity(p);.    pCo
7f60: 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->pColl = sqlit
7f70: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
7f80: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
7f90: 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29  ( !pCol->pColl )
7fa0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43  {.      pCol->pC
7fb0: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
7fc0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
7fd0: 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69   }.  }.  pTab->i
7fe0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74  PKey = -1;.  ret
7ff0: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
8000: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45 4c  ** Prepare a SEL
8010: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
8020: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20  r processing by 
8030: 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  doing the follow
8040: 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a  ing.** things:.*
8050: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
8060: 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
8070: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
8080: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
8090: 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
80a0: 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
80b0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
80c0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
80d0: 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
80e0: 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
80f0: 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
8100: 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
8110: 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
8120: 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
8130: 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
8140: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
8150: 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
8160: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
8170: 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
8180: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
8190: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
81a0: 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
81b0: 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
81c0: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
81d0: 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
81e0: 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
81f0: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
8200: 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
8210: 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
8220: 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
8230: 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
8240: 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
8250: 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72  essing up the pr
8260: 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  esistent represe
8270: 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
8280: 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
8290: 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
82a0: 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
82b0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
82c0: 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  ccomodate the NA
82d0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
82e0: 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
82f0: 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
8300: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
8310: 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
8320: 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
8330: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
8340: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8350: 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
8360: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
8370: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
8380: 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
8390: 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
83a0: 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
83b0: 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
83c0: 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
83d0: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
83e0: 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
83f0: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
8400: 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
8410: 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
8420: 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  E..**.** Return 
8430: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  0 on success.  I
8440: 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f 62  f there are prob
8450: 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  lems, leave an e
8460: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
8470: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
8480: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
8490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
84a0: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
84b0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
84c0: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  t *p){.  int i, 
84d0: 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c  j, k, rc;.  SrcL
84e0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
84f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8500: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
8510: 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
8520: 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
8530: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
8540: 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->pSrc==0 || sql
8550: 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
8560: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8570: 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d   1;.  pTabList =
8580: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
8590: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
85a0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
85b0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
85c0: 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
85d0: 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
85e0: 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
85f0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
8600: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8610: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
8620: 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
8630: 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
8640: 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  pSrc);..  /* Loo
8650: 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
8660: 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
8670: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
8680: 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
8690: 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
86a0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
86b0: 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
86c0: 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
86d0: 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
86e0: 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
86f0: 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
8700: 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
8710: 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
8720: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
8730: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
8740: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
8750: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
8760: 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  ){.    if( pFrom
8770: 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20  ->pTab!=0 ){.   
8780: 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65     /* This state
8790: 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79  ment has already
87a0: 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20   been prepared. 
87b0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
87c0: 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f  d.      ** to go
87d0: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
87e0: 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20     assert( i==0 
87f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8800: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
8810: 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
8820: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
8830: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8840: 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
8850: 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
8860: 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
8870: 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
8880: 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
8890: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  lect!=0 );.     
88a0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69   if( pFrom->zAli
88b0: 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  as==0 ){.       
88c0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pFrom->zAlias =
88d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
88e0: 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c 69 74  e3MPrintf("sqlit
88f0: 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
8900: 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70   (void*)pFrom->p
8910: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
8920: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8930: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
8940: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
8950: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
8960: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 75       sqlite3Resu
8970: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
8980: 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c  arse, pFrom->zAl
8990: 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ias, pFrom->pSel
89a0: 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ect);.      if( 
89b0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
89c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
89d0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68     }.      /* Th
89e0: 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c  e isTransient fl
89f0: 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
8a00: 74 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  t the Table stru
8a10: 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20  cture has been. 
8a20: 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61       ** dynamica
8a30: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  lly allocated an
8a40: 64 20 6d 61 79 20 62 65 20 66 72 65 65 64 20 61  d may be freed a
8a50: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20  t any time.  In 
8a60: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20  other words,.   
8a70: 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f     ** pTab is no
8a80: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  t pointing to a 
8a90: 70 65 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65  persistent table
8aa0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8ab0: 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  defines.      **
8ac0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 63 68   part of the sch
8ad0: 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54  ema. */.      pT
8ae0: 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20  ab->isTransient 
8af0: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
8b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
8b10: 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
8b20: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
8b30: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
8b40: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
8b50: 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
8b60: 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
8b70: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
8b80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b90: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
8ba0: 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c  se,pFrom->zName,
8bb0: 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pFrom->zDatabase
8bc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
8bd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
8be0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
8bf0: 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
8c00: 65 66 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  ef++;.#ifndef SQ
8c10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
8c20: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
8c30: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
8c40: 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
8c50: 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
8c60: 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
8c70: 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
8c80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
8c90: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
8ca0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
8cb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
8cc0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
8cd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70  .        /* If p
8ce0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
8cf0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
8d00: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a   dealing with a.
8d10: 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20          ** view 
8d20: 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20  within a view.  
8d30: 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63  The SELECT struc
8d40: 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79  ture has already
8d50: 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   been.        **
8d60: 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f   copied by the o
8d70: 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20  uter view so we 
8d80: 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70  can skip the cop
8d90: 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20  y step here.    
8da0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
8db0: 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20  ner view..      
8dc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
8dd0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
8de0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8df0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
8e00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8e10: 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  p(pTab->pSelect)
8e20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8e30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
8e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
8e50: 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
8e60: 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
8e70: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
8e80: 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
8e90: 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  f( sqliteProcess
8ea0: 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
8eb0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f  ) return 1;..  /
8ec0: 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
8ed0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
8ee0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
8ef0: 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
8f00: 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
8f10: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
8f20: 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
8f30: 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
8f40: 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
8f50: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
8f60: 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
8f70: 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
8f80: 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
8f90: 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
8fa0: 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
8fb0: 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
8fc0: 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
8fd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
8fe0: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
8ff0: 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
9000: 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
9010: 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
9020: 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
9030: 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
9040: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
9050: 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
9060: 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
9070: 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
9080: 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
9090: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
90a0: 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
90b0: 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
90c0: 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
90d0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
90e0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
90f0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
9100: 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
9110: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
9120: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
9130: 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  eak;.    if( pE-
9140: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
9150: 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d  E->pRight && pE-
9160: 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
9170: 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ALL.         && 
9180: 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d  pE->pLeft && pE-
9190: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
91a0: 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  D ) break;.  }. 
91b0: 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b   rc = 0;.  if( k
91c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
91d0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
91e0: 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
91f0: 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
9200: 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
9210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
9220: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
9230: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
9240: 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
9250: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
9260: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
9270: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9280: 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
9290: 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
92a0: 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
92b0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
92c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
92d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
92e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
92f0: 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
9300: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
9310: 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
9320: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
9330: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26  lColNames)!=0 &&
9340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9350: 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
9360: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
9370: 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
9380: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
9390: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
93a0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
93b0: 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
93c0: 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
93d0: 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20  _ALL &&.        
93e0: 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44     (pE->op!=TK_D
93f0: 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
9400: 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  ==0 || pE->pRigh
9410: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29  t->op!=TK_ALL) )
9420: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
9430: 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70  s particular exp
9440: 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ression does not
9450: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
9460: 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nded..        */
9470: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
9480: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9490: 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d  ppend(pNew, a[k]
94a0: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
94b0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
94c0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
94d0: 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
94e0: 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
94f0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ame;.        }el
9500: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
9510: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
9520: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78          a[k].pEx
9530: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
9540: 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
9550: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9560: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
9570: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
9580: 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
9590: 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
95a0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
95b0: 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
95c0: 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
95d0: 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
95e0: 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
95f0: 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
9600: 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20    char *zTName; 
9610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65             /* te
9620: 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
9630: 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
9640: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
9650: 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29  T && pE->pLeft )
9660: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  {.          zTNa
9670: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
9680: 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70  FromToken(&pE->p
9690: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
96a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
96b0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
96c0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
96d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
96e0: 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
96f0: 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
9700: 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
9710: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
9720: 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
9730: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
9740: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
9750: 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
9760: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
9770: 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
9780: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
9790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
97a0: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
97b0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
97c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
97d0: 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61  TName && (zTabNa
97e0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
97f0: 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20  e[0]==0 || .    
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
9810: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
9820: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
9830: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9840: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9860: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
9870: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
9880: 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
9890: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
98a0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
98b0: 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b  *pLeft, *pRight;
98c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
98d0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
98e0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
98f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9900: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
9910: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
9920: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
9930: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
9940: 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
9950: 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e      if( (pLeft->
9960: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
9970: 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  TURAL)!=0 &&.   
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78       columnIndex
99a0: 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e  (pLeft->pTab, zN
99b0: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
99c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
99d0: 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
99e0: 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
99f0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
9a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a10: 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65   ** table on the
9a20: 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20   right */.      
9a30: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
9a40: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
9a50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
9a60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c    if( sqlite3IdL
9a70: 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  istIndex(pLeft->
9a80: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
9a90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
9aa0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
9ab0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
9ac0: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
9ad0: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
9af0: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
9b00: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
9b10: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
9b20: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
9b30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
9b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9b50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
9b60: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
9b70: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
9b80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
9b90: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
9ba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9bb0: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52      setToken(&pR
9bc0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61  ight->token, zNa
9bd0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
9be0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
9bf0: 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70   (longNames || p
9c00: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
9c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9c20: 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
9c30: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
9c40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
9c50: 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
9c60: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
9c70: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
9c80: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
9c90: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
9ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9cb0: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
9cc0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54  pLeft->token, zT
9cd0: 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
9ce0: 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28         setToken(
9cf0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71  &pExpr->span, sq
9d00: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73  lite3MPrintf("%s
9d10: 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
9d20: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
9d30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
9d40: 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20  an.dyn = 1;.    
9d50: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
9d60: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20  >token.z = 0;.  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9d80: 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a  r->token.n = 0;.
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9da0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  xpr->token.dyn =
9db0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
9dc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9dd0: 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
9de0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
9df0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d     pExpr->span =
9e00: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20   pExpr->token;. 
9e10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9e20: 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
9e30: 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
9e40: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
9e50: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9e60: 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72  pend(pNew, pExpr
9e70: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b  , &pExpr->span);
9e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
9e90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
9ea0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9eb0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
9ec0: 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69  New, pExpr, &pRi
9ed0: 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  ght->token);.   
9ee0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9ef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
9f00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
9f10: 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
9f20: 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
9f30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
9f40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9f50: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9f60: 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
9f70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
9f80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9f90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9fa0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
9fb0: 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
9fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9fd0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
9fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ff0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e    sqliteFree(zTN
a000: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
a010: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
a020: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
a030: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
a040: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
a050: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a060: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a070: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
a080: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
a090: 72 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74  routine associat
a0a0: 65 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e  es entries in an
a0b0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
a0c0: 73 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a  sion list with.*
a0d0: 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72  * columns in a r
a0e0: 65 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68  esult.  For each
a0f0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
a100: 73 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65  sion, the opcode
a110: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c   of.** the top-l
a120: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61  evel node is cha
a130: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
a140: 4e 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d  N and the iColum
a150: 6e 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  n value of.** th
a160: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65  e top-level node
a170: 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69   is filled in wi
a180: 74 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  th column number
a190: 20 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a   and the iTable.
a1a0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
a1b0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
a1c0: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54  s filled with iT
a1d0: 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a  able parameter..
a1e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
a1f0: 72 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20  re prior SELECT 
a200: 63 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72  clauses, they ar
a210: 65 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73  e processed firs
a220: 74 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69  t.  A match.** i
a230: 6e 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c  n an earlier SEL
a240: 45 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64  ECT takes preced
a250: 65 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65  ence over a late
a260: 72 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  r SELECT..**.** 
a270: 41 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64  Any entry that d
a280: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73  oes not match is
a290: 20 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65   flagged as an e
a2a0: 72 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  rror.  The numbe
a2b0: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69  r.** of errors i
a2c0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
a2d0: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
a2e0: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a  rderbyToColumn(.
a2f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
a310: 6c 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72  lace to leave er
a320: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
a330: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
a340: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
a350: 63 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c  ch to result col
a360: 75 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c  umns of this SEL
a370: 45 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ECT */.  ExprLis
a380: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
a390: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
a3a0: 20 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68   values to match
a3b0: 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73   against columns
a3c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
a3d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
a3e0: 20 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c   Insert this val
a3f0: 75 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a  ue in iTable */.
a400: 20 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65    int mustComple
a410: 74 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  te        /* If 
a420: 54 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42  TRUE all ORDER B
a430: 59 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f  Ys must match */
a440: 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  .){.  int nErr =
a450: 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   0;.  int i, j;.
a460: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a470: 73 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65  st;..  if( pSele
a480: 63 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42  ct==0 || pOrderB
a490: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  y==0 ) return 1;
a4a0: 0a 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  .  if( mustCompl
a4b0: 65 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ete ){.    for(i
a4c0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
a4d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72  nExpr; i++){ pOr
a4e0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
a4f0: 20 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66   = 0; }.  }.  if
a500: 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
a510: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
a520: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
a530: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65  1;.  }.  if( pSe
a540: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
a550: 20 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64      if( matchOrd
a560: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
a570: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50  rse, pSelect->pP
a580: 72 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  rior, pOrderBy, 
a590: 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
a5a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a5b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
a5c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
a5d0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
a5e0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
a5f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
a600: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
a610: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a620: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
a630: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
a640: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f  ->a[i].done ) co
a650: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a660: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
a670: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
a680: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
a690: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
a6a0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
a6b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
a6c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
a6d0: 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42          "ORDER B
a6e0: 59 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68  Y position %d sh
a6f0: 6f 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20  ould be between 
a700: 31 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20  1 and %d",.     
a710: 20 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73       iCol, pELis
a720: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
a730: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
a740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a750: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73  }.      if( !mus
a760: 74 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74  tComplete ) cont
a770: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c  inue;.      iCol
a780: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  --;.    }.    fo
a790: 72 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26  r(j=0; iCol<0 &&
a7a0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
a7b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
a7c0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ( pEList->a[j].z
a7d0: 4e 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d  Name && (pE->op=
a7e0: 3d 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70  =TK_ID || pE->op
a7f0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a  ==TK_STRING) ){.
a800: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
a810: 61 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20  ame, *zLabel;.  
a820: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
a830: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
a840: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c  ;.        zLabel
a850: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
a860: 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b  omToken(&pE->tok
a870: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  en);.        ass
a880: 65 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29  ert( zLabel!=0 )
a890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
a8a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
a8b0: 6d 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29  me, zLabel)==0 )
a8c0: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  { .          iCo
a8d0: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d  l = j;.        }
a8e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
a8f0: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
a900: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
a910: 43 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33  Col<0 && sqlite3
a920: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20  ExprCompare(pE, 
a930: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
a940: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pr) ){.        i
a950: 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d  Col = j;.      }
a960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
a970: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
a980: 70 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pE->op = TK_COLU
a990: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43  MN;.      pE->iC
a9a0: 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
a9b0: 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d      pE->iTable =
a9c0: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70   iTable;.      p
a9d0: 45 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  E->iAgg = -1;.  
a9e0: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
a9f0: 69 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  i].done = 1;.   
aa00: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c   }.    if( iCol<
aa10: 30 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74  0 && mustComplet
aa20: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
aa30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aa40: 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45  e,.        "ORDE
aa50: 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72  R BY term number
aa60: 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   %d does not mat
aa70: 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f  ch any result co
aa80: 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20  lumn", i+1);.   
aa90: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
aaa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
aab0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
aac0: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23    .}.#endif /* #
aad0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aae0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
aaf0: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  CT */../*.** Get
ab00: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
ab10: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
ab20: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
ab30: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
ab40: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
ab50: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
ab60: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
ab70: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
ab80: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
ab90: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
aba0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
abb0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
abc0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
abd0: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
abe0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
abf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
ac00: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
ac10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
ac20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
ac30: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
ac40: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
ac50: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
ac60: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
ac70: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
ac80: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
ac90: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
aca0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
acb0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
acc0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
acd0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
ace0: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
acf0: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
ad00: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
ad10: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
ad20: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
ad30: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
ad40: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
ad50: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
ad60: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
ad70: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
ad80: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
ad90: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
ada0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
adb0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
adc0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
add0: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
ade0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
adf0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
ae00: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
ae10: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 69 66  es the values if
ae20: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
ae30: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
ae40: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
ae50: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
ae60: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
ae70: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
ae80: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
ae90: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
aea0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
aeb0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
aec0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
aed0: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
aee0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
aef0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
af00: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
af10: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
af20: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
af30: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
af40: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
af50: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
af60: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
af70: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
af80: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
af90: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
afa0: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
afb0: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
afc0: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
afd0: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
afe0: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
aff0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
b000: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
b010: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
b020: 6b 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  k){.  /* .  ** "
b030: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
b040: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
b050: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
b060: 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79    ** contraversy
b070: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
b080: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
b090: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
b0a0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
b0b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
b0c0: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
b0d0: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
b0e0: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   rows..  */.  if
b0f0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
b100: 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50     int iMem = pP
b110: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
b120: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b130: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b140: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
b150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
b160: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b170: 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
b180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b190: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
b1a0: 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a  stBeInt, 0, 0);.
b1b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b1c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74  ddOp(v, OP_Negat
b1d0: 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ive, 0, 0);.    
b1e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b1f0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
b200: 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56   iMem, 1);.    V
b210: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b220: 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22  # LIMIT counter"
b230: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
b240: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b250: 66 4d 65 6d 5a 65 72 6f 2c 20 69 4d 65 6d 2c 20  fMemZero, iMem, 
b260: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 70 2d 3e  iBreak);.    p->
b270: 69 4c 69 6d 69 74 20 3d 20 69 4d 65 6d 3b 0a 20  iLimit = iMem;. 
b280: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
b290: 73 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  set ){.    int i
b2a0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
b2b0: 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20 2a  em++;.    Vdbe *
b2c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
b2d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
b2e0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
b2f0: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
b300: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b310: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
b320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b330: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b340: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b360: 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
b370: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
b380: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b390: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
b3a0: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
b3b0: 65 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45  ent((v, "# OFFSE
b3c0: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
b3d0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
b3e0: 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Mem;.  }.}../*.*
b3f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72  * Allocate a vir
b400: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
b410: 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  e for sorting..*
b420: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
b430: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
b440: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b450: 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c  Select *p, ExprL
b460: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a  ist *pOrderBy){.
b470: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
b480: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
b490: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64      assert( pOrd
b4a0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d  erBy->iECursor==
b4b0: 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  0 );.    pOrderB
b4c0: 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
b4d0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b4e0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b4f0: 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73 65  VdbeAddOp(pParse
b500: 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e  ->pVdbe, OP_Open
b510: 56 69 72 74 75 61 6c 2c 0a 20 20 20 20 20 20 20  Virtual,.       
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
b540: 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
b550: 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20  y->nExpr+1);.   
b560: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
b570: 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 3d 20 2d  OpenVirt[2] == -
b580: 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  1 );.    p->addr
b590: 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64  OpenVirt[2] = ad
b5a0: 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dr;.  }.}../*.**
b5b0: 20 54 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61   The opcode at a
b5c0: 64 64 72 20 69 73 20 61 6e 20 4f 50 5f 4f 70 65  ddr is an OP_Ope
b5d0: 6e 56 69 72 74 75 61 6c 20 74 68 61 74 20 63 72  nVirtual that cr
b5e0: 65 61 74 65 64 20 61 20 73 6f 72 74 69 6e 67 0a  eated a sorting.
b5f0: 2a 2a 20 69 6e 64 65 78 20 74 68 61 20 77 65 20  ** index tha we 
b600: 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 6e 65 65  ended up not nee
b610: 64 69 6e 67 2e 20 20 54 68 69 73 20 72 6f 75 74  ding.  This rout
b620: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ine changes that
b630: 0a 2a 2a 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  .** opcode to OP
b640: 5f 4e 6f 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  _Noop..*/.static
b650: 20 76 6f 69 64 20 75 6e 63 72 65 61 74 65 53 6f   void uncreateSo
b660: 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65  rtingIndex(Parse
b670: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 61 64   *pParse, int ad
b680: 64 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  dr){.  Vdbe *v =
b690: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
b6a0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
b6b0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
b6c0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c  (v, addr);.  sql
b6d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
b6e0: 28 76 2c 20 61 64 64 72 2c 20 30 2c 20 30 29 3b  (v, addr, 0, 0);
b6f0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
b700: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 70 4f 70 2d   OP_Noop;.  pOp-
b710: 3e 70 31 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p1 = 0;.  pOp->
b720: 70 32 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  p2 = 0;.}..#ifnd
b730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
b740: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
b750: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
b760: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
b770: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
b780: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
b790: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
b7a0: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
b7b0: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
b7c0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
b7d0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
b7e0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
b7f0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
b800: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
b810: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
b820: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
b830: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
b840: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
b850: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
b860: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
b870: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
b880: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
b890: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
b8a0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
b8b0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
b8c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
b8d0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
b8e0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
b8f0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
b900: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
b910: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
b920: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
b930: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
b940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
b950: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
b960: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
b970: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
b980: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
b990: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
b9a0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
b9b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
b9c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b9d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b9e0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
b9f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ba00: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ba10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ba20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
ba30: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
ba40: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
ba50: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
ba60: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
ba70: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
ba80: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
ba90: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
baa0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
bab0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
bac0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
bad0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
bae0: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
baf0: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
bb00: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
bb10: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
bb20: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
bb30: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
bb40: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
bb50: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
bb60: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
bb70: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
bb80: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
bb90: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
bba0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
bbb0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
bbc0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
bbd0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
bbe0: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
bbf0: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
bc00: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
bc10: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
bc20: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
bc30: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
bc40: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
bc50: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
bc60: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
bc70: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bc80: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
bc90: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
bca0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
bcb0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
bcc0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
bcd0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
bce0: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
bcf0: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
bd00: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
bd10: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
bd20: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
bd30: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
bd40: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
bd50: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
bd60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
bd70: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
bd80: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
bd90: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
bda0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
bdb0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
bdc0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
bdd0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
bde0: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
bdf0: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
be00: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
be10: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
be20: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
be30: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
be40: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
be50: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
be60: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
be70: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
be80: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
be90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
bea0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
beb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bec0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
bed0: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
bee0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ed */.  int eDes
bef0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
bf00: 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65   \___  Store que
bf10: 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70  ry results as sp
bf20: 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  ecified */.  int
bf30: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
bf40: 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74     /* /     by t
bf50: 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74  hese two paramet
bf60: 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a  ers.         */.
bf70: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
bf80: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
bf90: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
bfa0: 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
bfb0: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
bfc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bfd0: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
bfe0: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
bff0: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
c000: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
c010: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
c020: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
c030: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
c040: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
c050: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
c060: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
c070: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
c080: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
c090: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
c0a0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
c0b0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c  t set */.  ExprL
c0c0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
c0d0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
c0e0: 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a   clause on p */.
c0f0: 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b    int aSetP2[2];
c100: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50          /* Set P
c110: 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65  2 value of these
c120: 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66   op to number of
c130: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
c140: 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20  t nSetP2 = 0;   
c150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c160: 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32   slots in aSetP2
c170: 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a  [] used */..  /*
c180: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
c190: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
c1a0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
c1b0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
c1c0: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
c1d0: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
c1e0: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
c1f0: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
c200: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
c210: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
c220: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
c230: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
c240: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
c250: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c260: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
c270: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
c280: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
c290: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
c2a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
c2b0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
c2c0: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
c2d0: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
c2e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c2f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
c300: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
c310: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
c320: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
c330: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
c340: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
c350: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
c360: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
c370: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
c380: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
c390: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
c3a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c3b0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
c3c0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
c3d0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
c3e0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
c3f0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
c400: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
c410: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c420: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
c430: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
c440: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
c450: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
c460: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
c470: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
c480: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c490: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
c4a0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
c4b0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
c4c0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
c4d0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
c4e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
c4f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
c500: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
c510: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
c520: 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20  VirtualTab ){.  
c530: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c540: 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ist );.    asser
c550: 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
c560: 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
c570: 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
c580: 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b    aSetP2[nSetP2+
c590: 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  +] = sqlite3Vdbe
c5a0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
c5b0: 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20  Virtual, iParm, 
c5c0: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
c5d0: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
c5e0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
c5f0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
c600: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
c610: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
c620: 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  /.  pOrderBy = p
c630: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77  ->pOrderBy;.  sw
c640: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
c650: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
c660: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
c670: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
c680: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
c690: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c6a0: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
c6b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
c6c0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
c6d0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
c6e0: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
c6f0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
c700: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c710: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c720: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
c730: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c740: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  aff);.        if
c750: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c760: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c770: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c780: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
c790: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c7a0: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
c7b0: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
c7c0: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c7d0: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c7e0: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  et;.        p->p
c7f0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
c800: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c810: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
c820: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
c830: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
c840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c850: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
c860: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b  , p->iLimit, 0);
c870: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
c880: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4a 75  omment((v, "# Ju
c890: 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
c8a0: 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
c8b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c8c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
c8d0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
c8e0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
c8f0: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
c900: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
c910: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
c920: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c930: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c940: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c950: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c960: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
c970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c980: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c9a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c9b0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
c9c0: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
c9d0: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
c9e0: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
c9f0: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
ca00: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
ca10: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
ca20: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
ca30: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
ca40: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
ca50: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
ca60: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
ca70: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
ca80: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
ca90: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
caa0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
cab0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
cac0: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
cad0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
cae0: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
caf0: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
cb00: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
cb10: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
cb20: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
cb30: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
cb40: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
cb50: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
cb60: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
cb70: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
cb80: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
cb90: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
cba0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
cbb0: 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72  riorOp && pOrder
cbc0: 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69  By==0 && !p->pLi
cbd0: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
cbe0: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
cbf0: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
cc00: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
cc10: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
cc20: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
cc30: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
cc40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cc50: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61    unionTab = iPa
cc60: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
cc70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
cc80: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
cc90: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
cca0: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
ccb0: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
ccc0: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
ccd0: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
cce0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
ccf0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
cd00: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
cd10: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ( pOrderBy && ma
cd20: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
cd30: 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  mn(pParse, p, pO
cd40: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
cd50: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,1) ){.         
cd60: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
cd70: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
cd80: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
cd90: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
cda0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
cdb0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
cdc0: 72 74 75 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  rtual, unionTab,
cdd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
cde0: 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61   priorOp==SRT_Ta
cdf0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ble ){.         
ce00: 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
ce10: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
ce20: 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
ce30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 53   );.          aS
ce40: 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d  etP2[nSetP2++] =
ce50: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 7d   addr;.        }
ce60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ce70: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
ce80: 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31  penVirt[0] == -1
ce90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
cea0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d  >addrOpenVirt[0]
ceb0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
cec0: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
ced0: 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 31 3b 0a  ->usesVirt = 1;.
cee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cef0: 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49    createSortingI
cf00: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20  ndex(pParse, p, 
cf10: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
cf20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
cf30: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
cf40: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
cf50: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cf60: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
cf70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
cf80: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
cf90: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
cfa0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cfb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
cfc0: 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75  rior, priorOp, u
cfd0: 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30  nionTab, 0, 0, 0
cfe0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
cff0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d000: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d010: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
d020: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d030: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
d040: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
d050: 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68   */.      switch
d060: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
d070: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
d080: 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f 45 78  PT:  op = SRT_Ex
d090: 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  cept;   break;. 
d0a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
d0b0: 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52  UNION:   op = SR
d0c0: 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61  T_Union;    brea
d0d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  k;.         case
d0e0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20   TK_ALL:     op 
d0f0: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
d100: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
d110: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d120: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72   0;.      p->pOr
d130: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
d140: 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65   p->disallowOrde
d150: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 21 3d  rBy = pOrderBy!=
d160: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
d170: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
d180: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
d190: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
d1a0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
d1b0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d1c0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
d1d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d1e0: 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f  rse, p, op, unio
d1f0: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
d200: 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ff);.      p->pP
d210: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
d220: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
d230: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
d240: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d250: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
d260: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
d270: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
d280: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
d290: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
d2a0: 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20  iLimit = -1;.   
d2b0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
d2c0: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  -1;.      if( rc
d2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d2e0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d2f0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20  d;.      }...   
d300: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
d310: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65  e data in the te
d320: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e  mporary table in
d330: 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
d340: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
d350: 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c  that we currentl
d360: 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  y need..      */
d370: 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
d380: 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20   eDest!=priorOp 
d390: 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61  || unionTab!=iPa
d3a0: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
d3b0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
d3c0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
d3d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
d3e0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
d3f0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
d400: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
d410: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
d420: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
d430: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
d440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d450: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
d460: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d470: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
d480: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d490: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
d4a0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
d4b0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
d4c0: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
d4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
d4f0: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
d500: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
d510: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
d520: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d530: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
d540: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
d550: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
d560: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
d570: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d5a0: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
d5b0: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
d5e0: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
d5f0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d600: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
d610: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
d620: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d630: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d650: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
d660: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
d670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d680: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
d690: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
d6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d6b0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d6c0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d6d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d6e0: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d6f0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
d700: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d710: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d720: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
d730: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
d740: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
d750: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
d760: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
d770: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
d780: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
d790: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a   addr;..      /*
d7a0: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
d7b0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
d7c0: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
d7d0: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
d7e0: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
d7f0: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
d800: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
d810: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
d820: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
d830: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
d840: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
d850: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
d860: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d870: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
d880: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d890: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
d8a0: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
d8b0: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
d8c0: 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31  ,p,pOrderBy,tab1
d8d0: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,1) ){.        r
d8e0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
d8f0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d900: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
d910: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
d920: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
d930: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
d940: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d950: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d960: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 74  P_OpenVirtual, t
d970: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab1, 0);.      a
d980: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
d990: 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20  enVirt[0] == -1 
d9a0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
d9b0: 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64  OpenVirt[0] = ad
d9c0: 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69  dr;.      p->pRi
d9d0: 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72  ghtmost->usesVir
d9e0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  t = 1;.      ass
d9f0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
da00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
da10: 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20   the SELECTs to 
da20: 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65  our left into te
da30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
da40: 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ab1"..      */. 
da50: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
da60: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
da70: 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f  pPrior, SRT_Unio
da80: 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20 30  n, tab1, 0, 0, 0
da90: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
daa0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
dab0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
dac0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
dad0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
dae0: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
daf0: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
db00: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
db10: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
db20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
db30: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
db40: 72 74 75 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  rtual, tab2, 0);
db50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
db60: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31  ->addrOpenVirt[1
db70: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
db80: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
db90: 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
dba0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
dbb0: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
dbc0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
dbd0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
dbe0: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
dbf0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
dc00: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
dc10: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dc20: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
dc30: 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c  e, p, SRT_Union,
dc40: 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20   tab2, 0, 0, 0, 
dc50: 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  aff);.      p->p
dc60: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
dc70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dc80: 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69  rDelete(p->pLimi
dc90: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
dca0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
dcb0: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
dcc0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
dcd0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
dce0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
dcf0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
dd00: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
dd10: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
dd20: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
dd30: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
dd40: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
dd50: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
dd60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
dd70: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
dd80: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
dd90: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
dda0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
ddb0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
ddc0: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
ddd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
dde0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
ddf0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
de00: 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
de10: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
de20: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
de30: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
de40: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
de50: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
de60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
de70: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
de80: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
de90: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
dea0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
deb0: 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30  _RowKey, tab1, 0
dec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ded0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dee0: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
def0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
df00: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
df10: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
df20: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
df30: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
df60: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
df70: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
dfa0: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
dfb0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
dfc0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
dfd0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
dfe0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
dff0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
e000: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e010: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
e020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e030: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
e040: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
e050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e060: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
e070: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
e080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e090: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
e0a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e0b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e0c0: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
e0d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e0e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e0f0: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
e100: 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
e110: 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
e120: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
e130: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
e140: 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
e150: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
e160: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
e170: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
e180: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
e190: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
e1a0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
e1b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e1c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
e1d0: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
e1e0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
e1f0: 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
e200: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
e210: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
e220: 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
e230: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
e240: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
e250: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e260: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
e270: 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
e280: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
e290: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e2a0: 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70  .  */.  nCol = p
e2b0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
e2c0: 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32  .  while( nSetP2
e2d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
e2e0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
e2f0: 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c  SetP2[--nSetP2],
e300: 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f   nCol);.  }..  /
e310: 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
e320: 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
e330: 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68 65  ed by either the
e340: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e350: 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20   or.  ** by any 
e360: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e370: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
e380: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
e390: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
e3a0: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
e3b0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
e3c0: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
e3d0: 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  les.  Invoke the
e3e0: 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70  .  ** ORDER BY p
e3f0: 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68 65  rocessing if the
e400: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
e410: 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  Y clause..  **. 
e420: 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
e430: 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
e440: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
e450: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
e460: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
e470: 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
e480: 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
e490: 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
e4a0: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
e4b0: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
e4c0: 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
e4d0: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
e4e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
e4f0: 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
e500: 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
e510: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
e520: 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73  OrderBy || p->us
e530: 65 73 56 69 72 74 20 29 7b 0a 20 20 20 20 69 6e  esVirt ){.    in
e540: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e560: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
e570: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
e580: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
e590: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
e5a0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
e5b0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
e5c0: 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e5e0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
e5f0: 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
e600: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43  tements */.    C
e610: 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
e620: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
e630: 43 6f 70 79 3b 0a 0a 20 20 20 20 61 73 73 65 72  Copy;..    asser
e640: 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
e650: 3d 3d 70 20 29 3b 0a 20 20 20 20 70 4b 65 79 49  ==p );.    pKeyI
e660: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
e670: 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49  oc(sizeof(*pKeyI
e680: 6e 66 6f 29 2b 6e 43 6f 6c 2a 32 2a 73 69 7a 65  nfo)+nCol*2*size
e690: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e  of(CollSeq*) + n
e6a0: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 70  Col);.    if( !p
e6b0: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
e6c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
e6d0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
e6e0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e6f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
e700: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72  Info->enc = pPar
e710: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
e720: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
e730: 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
e740: 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
e750: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
e760: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
e770: 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
e780: 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
e790: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
e7a0: 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
e7b0: 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
e7c0: 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
e7d0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
e7e0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
e7f0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
e800: 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
e810: 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
e820: 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
e830: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
e840: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
e850: 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
e860: 4f 70 65 6e 56 69 72 74 5b 69 5d 3b 0a 20 20 20  OpenVirt[i];.   
e870: 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
e880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e890: 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
e8a0: 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
e8b0: 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
e8c0: 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
e8d0: 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
e8e0: 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
e8f0: 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
e900: 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
e910: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
e920: 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
e930: 4f 70 65 6e 56 69 72 74 5b 31 5d 3c 30 20 29 3b  OpenVirt[1]<0 );
e940: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e950: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e970: 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
e980: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
e990: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e9a0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP3(v, addr, (ch
e9b0: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
e9c0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
e9d0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
e9e0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
e9f0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
ea00: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d  ist_item *pOTerm
ea10: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a   = pOrderBy->a;.
ea20: 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
ea30: 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  ByExpr = pOrderB
ea40: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
ea50: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
ea60: 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a  u8 *pSortOrder;.
ea70: 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 28  .      aCopy = (
ea80: 43 6f 6c 6c 53 65 71 2a 2a 29 26 70 4b 65 79 49  CollSeq**)&pKeyI
ea90: 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53  nfo[1];.      pS
eaa0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49  ortOrder = pKeyI
eab0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
eac0: 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43  = (u8*)&aCopy[nC
ead0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ol];.      memcp
eae0: 79 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66  y(aCopy, pKeyInf
eaf0: 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73  o->aColl, nCol*s
eb00: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29  izeof(CollSeq*))
eb10: 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d  ;.      apColl =
eb20: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
eb30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
eb40: 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70 72 3b   i<nOrderByExpr;
eb50: 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20   i++, pOTerm++, 
eb60: 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f  apColl++, pSortO
eb70: 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20  rder++){.       
eb80: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
eb90: 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  OTerm->pExpr;.  
eba0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
ebb0: 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a 4e 61 6d  e = pOTerm->zNam
ebc0: 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
ebd0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
ebe0: 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
ebf0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29  ->iColumn<nCol )
ec00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
ec10: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
ec20: 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74   *apColl = sqlit
ec30: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
ec40: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d  pParse, zName, -
ec50: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
ec60: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70  e{.          *ap
ec70: 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78  Coll = aCopy[pEx
ec80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  pr->iColumn];.  
ec90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eca0: 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f  *pSortOrder = pO
ecb0: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Term->sortOrder;
ecc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
ecd0: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
ece0: 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20  most==p );.     
ecf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
ed00: 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d 30 20 29  OpenVirt[2]>=0 )
ed10: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  ;.      addr = p
ed20: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
ed30: 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
ed40: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
ed50: 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  addr, p->pEList-
ed60: 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 20  >nExpr+2);.     
ed70: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
ed80: 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78 70 72  d = nOrderByExpr
ed90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
eda0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
edb0: 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
edc0: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
edd0: 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
ede0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20   pKeyInfo = 0;. 
edf0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72       generateSor
ee00: 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
ee10: 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   v, p->pEList->n
ee20: 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61  Expr, eDest, iPa
ee30: 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
ee40: 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65 79 49  sqliteFree(pKeyI
ee50: 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
ee60: 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72  _select_end:.  r
ee70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ee80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
ee90: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
eea0: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
eeb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
eec0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
eed0: 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
eee0: 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
eef0: 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
ef00: 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
ef10: 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
ef20: 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
ef30: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
ef40: 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
ef50: 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
ef60: 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
ef70: 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
ef80: 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
ef90: 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
efa0: 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
efb0: 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
efc0: 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
efd0: 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
efe0: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
eff0: 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
f000: 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
f010: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
f020: 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
f030: 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
f040: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
f050: 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
f060: 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
f070: 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
f080: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
f090: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
f0a0: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
f0b0: 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
f0c0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
f0d0: 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
f0e0: 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
f0f0: 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
f100: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
f110: 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
f120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
f130: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
f140: 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73  ist*,int,ExprLis
f150: 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  t*);  /* Forward
f160: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
f170: 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
f180: 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20  (Select *, int, 
f190: 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a  ExprList *);  /*
f1a0: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
f1b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
f1c0: 73 74 45 78 70 72 28 45 78 70 72 20 2a 70 45 78  stExpr(Expr *pEx
f1d0: 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  pr, int iTable, 
f1e0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
f1f0: 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
f200: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
f210: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
f220: 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
f230: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
f240: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
f250: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
f260: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
f270: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
f280: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
f290: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
f2a0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
f2b0: 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
f2c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
f2d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f2e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
f2f0: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
f300: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
f310: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
f320: 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
f330: 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
f340: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
f350: 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
f360: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
f370: 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
f380: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
f390: 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
f3a0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
f3b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
f3c0: 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a  p(pNew->pLeft);.
f3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
f3e0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
f3f0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
f400: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
f410: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 52 69  xprDup(pNew->pRi
f420: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ght);.      asse
f430: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
f440: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
f450: 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  pr->pList = sqli
f460: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
f470: 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  New->pList);.   
f480: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
f490: 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b   = pNew->iTable;
f4a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
f4b0: 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43  olumn = pNew->iC
f4c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78  olumn;.      pEx
f4d0: 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d  pr->iAgg = pNew-
f4e0: 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  >iAgg;.      sql
f4f0: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
f500: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
f510: 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
f520: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
f530: 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  py(&pExpr->span,
f540: 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20   &pNew->span);. 
f550: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c       pExpr->pSel
f560: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
f570: 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70 53 65  ectDup(pNew->pSe
f580: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78  lect);.      pEx
f590: 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77  pr->flags = pNew
f5a0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
f5b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
f5c0: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 4c 65  tExpr(pExpr->pLe
f5d0: 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
f5e0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
f5f0: 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  pr(pExpr->pRight
f600: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
f610: 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
f620: 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ct(pExpr->pSelec
f630: 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
f640: 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
f650: 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70 4c 69  rList(pExpr->pLi
f660: 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
f670: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
f680: 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
f690: 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
f6a0: 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62 6c 65  List, int iTable
f6b0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
f6c0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
f6d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
f6e0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
f6f0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
f700: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73  ; i++){.    subs
f710: 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
f720: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
f730: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
f740: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
f750: 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a  tSelect(Select *
f760: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  p, int iTable, E
f770: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
f780: 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  {.  if( !p ) ret
f790: 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
f7a0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
f7b0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
f7c0: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
f7d0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54  (p->pGroupBy, iT
f7e0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
f7f0: 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
f800: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
f810: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
f820: 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
f830: 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ing, iTable, pEL
f840: 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
f850: 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  r(p->pWhere, iTa
f860: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ble, pEList);.}.
f870: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
f880: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
f890: 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  IEW) */..#ifndef
f8a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f8b0: 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  W./*.** This rou
f8c0: 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
f8d0: 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
f8e0: 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ies in order to 
f8f0: 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69  speed.** executi
f900: 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  on.  It returns 
f910: 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
f920: 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
f930: 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20  o flattening.** 
f940: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
f950: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
f960: 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
f970: 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
f980: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
f990: 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
f9a0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
f9b0: 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
f9c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
f9d0: 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
f9e0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
f9f0: 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
fa00: 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
fa10: 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
fa20: 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
fa30: 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
fa40: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
fa50: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
fa60: 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
fa70: 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
fa80: 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
fa90: 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
faa0: 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
fab0: 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
fac0: 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
fad0: 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
fae0: 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
faf0: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
fb00: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
fb10: 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
fb20: 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
fb30: 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
fb40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
fb50: 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
fb60: 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
fb70: 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
fb80: 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
fb90: 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
fba0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
fbb0: 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
fbc0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
fbd0: 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
fbe0: 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
fbf0: 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
fc00: 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
fc10: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
fc20: 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
fc30: 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
fc40: 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
fc50: 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
fc60: 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
fc70: 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
fc80: 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
fc90: 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
fca0: 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
fcb0: 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
fcc0: 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
fcd0: 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
fce0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
fcf0: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
fd00: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
fd10: 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
fd20: 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
fd30: 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
fd40: 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
fd50: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
fd60: 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
fd70: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
fd80: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
fd90: 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
fda0: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
fdb0: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
fdc0: 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
fdd0: 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20   join, or.**    
fde0: 20 20 20 20 74 68 65 20 73 75 62 71 75 65 72 79      the subquery
fdf0: 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61   is not itself a
fe00: 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65 74 20   join.  (Ticket 
fe10: 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  #306).**.**   (4
fe20: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
fe30: 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
fe40: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
fe50: 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
fe60: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
fe70: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
fe80: 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
fe90: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
fea0: 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
feb0: 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
fec0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
fed0: 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
fee0: 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
fef0: 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
ff00: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
ff10: 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
ff20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
ff30: 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
ff40: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
ff50: 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
ff60: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
ff70: 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
ff80: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
ff90: 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
ffa0: 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
ffb0: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
ffc0: 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
ffd0: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
ffe0: 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
fff0: 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
10000 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
10010 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
10020 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
10030 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
10040 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
10050 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
10060 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
10070 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
10080 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
10090 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
100a0 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
100b0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29  ses..**.**  (12)
100c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
100d0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
100e0 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f  term of a LEFT O
100f0 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65  UTER JOIN or the
10100 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
10110 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
10120 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64 65 64   clause.  (added
10130 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 30 29   by ticket #350)
10140 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
10150 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
10160 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
10170 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
10180 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
10190 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
101a0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
101b0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
101c0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
101d0 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
101e0 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
101f0 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
10200 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
10210 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
10220 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
10230 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
10240 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
10250 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
10260 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
10270 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
10280 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
10290 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
102a0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
102b0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
102c0 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
102d0 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
102e0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
102f0 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
10300 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
10310 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
10320 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
10330 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
10340 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10350 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
10360 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10370 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10380 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
10390 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
103a0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
103b0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
103c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
103d0 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
103e0 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
103f0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
10400 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
10410 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
10420 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
10430 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
10440 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
10450 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
10460 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
10470 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
10480 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
10490 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
104a0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
104b0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
104c0 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ery" */.  SrcLis
104d0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
104e0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
104f0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
10500 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
10510 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
10520 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
10530 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
10540 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10550 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
10560 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
10570 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
10580 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
10590 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
105a0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
105b0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
105c0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
105d0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
105e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
105f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
10600 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10620 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10630 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
10640 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
10650 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
10660 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  ubquery */..  /*
10670 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
10680 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
10690 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
106a0 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
106b0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
106c0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
106d0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
106e0 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
106f0 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
10700 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
10710 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
10720 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62  a[iFrom];.  pSub
10730 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
10740 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
10750 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
10760 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
10770 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
10780 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   0;.  if( subque
10790 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d  ryIsAgg && pSrc-
107a0 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e  >nSrc>1 ) return
107b0 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20 3d 20   0;.  pSubSrc = 
107c0 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
107d0 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
107e0 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e 70 4c  .  if( (pSub->pL
107f0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
10800 74 29 20 7c 7c 20 70 53 75 62 2d 3e 70 4f 66 66  t) || pSub->pOff
10810 73 65 74 20 7c 7c 20 0a 20 20 20 20 20 20 28 70  set || .      (p
10820 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 69  Sub->pLimit && i
10830 73 41 67 67 29 20 29 20 72 65 74 75 72 6e 20 30  sAgg) ) return 0
10840 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  ;.  if( pSubSrc-
10850 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
10860 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 2d  n 0;.  if( pSub-
10870 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20 28  >isDistinct && (
10880 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
10890 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
108a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
108b0 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74  f( p->isDistinct
108c0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
108d0 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  g ) return 0;.  
108e0 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77  if( (p->disallow
108f0 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f  OrderBy || p->pO
10900 72 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d  rderBy) && pSub-
10910 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
10920 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
10930 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
10940 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
10950 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
10960 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10970 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
10980 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
10990 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
109a0 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
109b0 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
109c0 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
109d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
109e0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
109f0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
10a00 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
10a10 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
10a20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
10a30 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
10a40 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
10a50 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
10a60 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
10a70 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
10a80 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
10a90 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
10aa0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
10ab0 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
10ac0 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
10ad0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
10ae0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
10af0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
10b00 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
10b10 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
10b20 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
10b30 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
10b40 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
10b50 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
10b60 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
10b70 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
10b80 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
10b90 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
10ba0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
10bb0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
10bc0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
10bd0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
10be0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
10bf0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
10c00 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
10c10 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
10c20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
10c30 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
10c40 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
10c50 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
10c60 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
10c70 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
10c80 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
10c90 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
10ca0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
10cb0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
10cc0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
10cd0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
10ce0 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
10cf0 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
10d00 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
10d10 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
10d20 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
10d30 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
10d40 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
10d50 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
10d60 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
10d70 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
10d80 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
10d90 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
10da0 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
10db0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
10dc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
10dd0 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
10de0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
10df0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
10e00 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
10e10 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
10e20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
10e30 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
10e40 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
10e50 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
10e60 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
10e70 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
10e80 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
10e90 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
10ea0 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
10eb0 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
10ec0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
10ed0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
10ee0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
10ef0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
10f00 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
10f10 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
10f20 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
10f30 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
10f40 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
10f50 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
10f60 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
10f70 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
10f80 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
10f90 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
10fa0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
10fb0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
10fc0 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
10fd0 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
10fe0 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
10ff0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
11000 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69  ntype;..    sqli
11010 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30  te3DeleteTable(0
11020 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  , pSubitem->pTab
11030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
11040 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  e(pSubitem->zDat
11050 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
11060 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
11070 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
11080 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d  iteFree(pSubitem
11090 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69  ->zAlias);.    i
110a0 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
110b0 20 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20        int extra 
110c0 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20  = nSubSrc - 1;. 
110d0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
110e0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
110f0 20 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71         pSrc = sq
11100 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
11110 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  nd(pSrc, 0, 0);.
11120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
11130 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
11140 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
11150 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e  nSrc-1; i-extra>
11160 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20  =iFrom; i--){.  
11170 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d        pSrc->a[i]
11180 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74   = pSrc->a[i-ext
11190 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra];.      }.   
111a0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
111b0 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
111c0 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  .      pSrc->a[i
111d0 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72  +iFrom] = pSubSr
111e0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d  c->a[i];.      m
111f0 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e  emset(&pSubSrc->
11200 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  a[i], 0, sizeof(
11210 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b  pSubSrc->a[i]));
11220 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d  .    }.    pSrc-
11230 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63  >a[iFrom+nSubSrc
11240 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  -1].jointype = j
11250 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
11260 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
11270 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
11280 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
11290 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
112a0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
112b0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
112c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
112d0 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
112e0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
112f0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
11300 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
11310 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
11320 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
11330 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
11360 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
11370 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
11380 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
11390 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
113a0 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
113b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
113c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
113d0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
113e0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
113f0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
11400 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
11410 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
11420 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
11430 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
11440 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
11450 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
11460 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
11470 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  /.  substExprLis
11480 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  t(p->pEList, iPa
11490 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
114a0 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  st);.  pList = p
114b0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
114c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
114d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
114e0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
114f0 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
11500 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78  zName==0 && (pEx
11510 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
11520 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21  .pExpr)->span.z!
11530 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73  =0 ){.      pLis
11540 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
11550 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63  sqliteStrNDup((c
11560 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e  har*)pExpr->span
11570 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  .z, pExpr->span.
11580 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
11590 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
115a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
115b0 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
115c0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
115d0 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
115e0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
115f0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
11600 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
11610 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
11620 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
11630 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
11640 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
11650 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
11660 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
11670 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
11680 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
11690 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
116a0 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
116b0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
116c0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
116d0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
116e0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
116f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11700 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
11710 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
11720 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
11730 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
11740 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
11750 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
11760 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
11770 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
11780 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
11790 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
117a0 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
117b0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
117c0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
117d0 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
117e0 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69  ExprAnd(p->pHavi
117f0 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ng, sqlite3ExprD
11800 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
11810 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
11820 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
11830 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
11840 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
11850 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
11860 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  oupBy);.  }else{
11870 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
11880 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
11890 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
118a0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
118b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
118c0 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  (p->pWhere, pWhe
118d0 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
118e0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
118f0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
11900 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
11910 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
11920 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
11930 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
11940 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
11950 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
11960 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
11970 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
11980 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
11990 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
119a0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
119b0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
119c0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
119d0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
119e0 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
119f0 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
11a00 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
11a10 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
11a20 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
11a30 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
11a40 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
11a50 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
11a60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
11a70 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
11a80 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
11a90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11aa0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
11ab0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
11ac0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11ad0 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
11ae0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
11af0 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
11b00 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
11b10 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
11b20 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
11b30 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
11b40 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
11b50 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
11b60 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
11b70 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
11b80 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
11b90 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
11ba0 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
11bb0 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
11bc0 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
11bd0 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
11be0 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
11bf0 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
11c00 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
11c10 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
11c20 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
11c30 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
11c40 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
11c50 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
11c60 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
11c70 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
11c80 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
11c90 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
11ca0 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
11cb0 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
11cc0 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
11cd0 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
11ce0 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
11cf0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
11d00 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
11d10 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
11d20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
11d30 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
11d40 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
11d50 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
11d60 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
11d70 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
11d80 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
11d90 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
11da0 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
11db0 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
11dc0 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
11dd0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
11de0 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
11df0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11e00 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
11e10 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
11e20 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
11e30 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
11e40 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
11e50 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
11e60 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
11e70 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
11e80 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
11e90 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
11ea0 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
11eb0 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78  int seekOp;.  Ex
11ec0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
11ed0 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
11ee0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
11ef0 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
11f00 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
11f10 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 0a 20 20  ;.  int brk;..  
11f20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11f30 69 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73  if this query is
11f40 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20   a simple min() 
11f50 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20  or max() query. 
11f60 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72   Return.  ** zer
11f70 6f 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e  o if it is  not.
11f80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11f90 47 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48  GroupBy || p->pH
11fa0 61 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65  aving || p->pWhe
11fb0 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  re ) return 0;. 
11fc0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
11fd0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
11fe0 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
11ff0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
12000 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
12010 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
12020 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70  return 0;.  pExp
12030 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
12040 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
12050 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
12060 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
12070 6e 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70  n 0;.  pList = p
12080 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69  Expr->pList;.  i
12090 66 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  f( pList==0 || p
120a0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
120b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
120c0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21   pExpr->token.n!
120d0 3d 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =3 ) return 0;. 
120e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
120f0 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
12100 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
12110 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ,3)==0 ){.    se
12120 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64  ekOp = OP_Rewind
12130 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
12140 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
12150 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
12160 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
12170 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
12180 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  OP_Last;.  }else
12190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
121a0 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70 4c    }.  pExpr = pL
121b0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
121c0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
121d0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65  !=TK_COLUMN ) re
121e0 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d  turn 0;.  iCol =
121f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
12200 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
12210 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
12220 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68 65   If we get to he
12230 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  re, it means the
12240 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68 65   query is of the
12250 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20   correct form.. 
12260 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   ** Check to mak
12270 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
12280 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65  n index and make
12290 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74   pIdx point to t
122a0 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69  he.  ** appropri
122b0 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74  ate index.  If t
122c0 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
122d0 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47  ) is on an INTEG
122e0 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20  ER PRIMARY.  ** 
122f0 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69  key column, no i
12300 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61 72  ndex is necessar
12310 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f  y so set pIdx to
12320 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20   NULL.  If no.  
12330 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20  ** usable index 
12340 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
12350 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69   0..  */.  if( i
12360 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64  Col<0 ){.    pId
12370 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  x = 0;.  }else{.
12380 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
12390 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
123a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
123b0 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28  pExpr);.    for(
123c0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
123d0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
123e0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
123f0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
12400 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20  nColumn>=1 );.  
12410 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
12420 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20  Column[0]==iCol 
12430 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f  && pIdx->keyInfo
12440 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c  .aColl[0]==pColl
12450 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
12460 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20      if( pIdx==0 
12470 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
12480 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
12490 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77  olumn types if w
124a0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
124b0 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54  the callback.  T
124c0 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73  his.  ** step is
124d0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
124e0 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20  output is going 
124f0 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20  to a table or a 
12500 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a  memory cell..  *
12510 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * The column nam
12520 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
12530 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69  been generated i
12540 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  n the calling fu
12550 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76  nction..  */.  v
12560 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12570 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
12580 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
12590 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  ;..  /* If the o
125a0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
125b0 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
125c0 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
125d0 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
125e0 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
125f0 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20  VirtualTab ){.  
12600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12610 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
12620 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tual, iParm, 1);
12630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12640 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69  ating code to fi
12650 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68  nd the min or th
12660 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c  e max.  Basicall
12670 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20  y all we have.  
12680 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64  ** to do is find
12690 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74 68   the first or th
126a0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
126b0 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78  the chosen index
126c0 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d  .  If.  ** the m
126d0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
126e0 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20   on the INTEGER 
126f0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
12700 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  n find the first
12710 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e  .  ** or last en
12720 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  try in the main 
12730 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  table..  */.  sq
12740 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
12750 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54  chema(pParse, pT
12760 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65  ab->iDb);.  base
12770 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43   = pSrc->a[0].iC
12780 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73  ursor;.  brk = s
12790 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
127a0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74  bel(v);.  comput
127b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
127c0 70 50 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b  pParse, p, brk);
127d0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30  .  if( pSrc->a[0
127e0 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ].pSelect==0 ){.
127f0 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
12800 61 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76  ableForReading(v
12810 2c 20 62 61 73 65 2c 20 70 54 61 62 29 3b 0a 20  , base, pTab);. 
12820 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30   }.  if( pIdx==0
12830 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12840 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
12850 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
12860 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76  }else{.    /* Ev
12870 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63 75  en though the cu
12880 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65  rsor used to ope
12890 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72 65  n the index here
128a0 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a   is closed.    *
128b0 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73  * as soon as a s
128c0 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20  ingle value has 
128d0 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69  been read from i
128e0 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20  t, allocate it. 
128f0 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61     ** using (pPa
12900 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20  rse->nTab++) to 
12910 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72 73  prevent the curs
12920 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67  or id from being
12930 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e   .    ** reused.
12940 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
12950 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt for statement
12960 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20  s of the form . 
12970 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e     ** "INSERT IN
12980 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28  TO x SELECT max(
12990 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a  ) FROM x"..    *
129a0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a  /.    int iIdx;.
129b0 20 20 20 20 69 49 64 78 20 3d 20 70 50 61 72 73      iIdx = pPars
129c0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
129d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
129e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70  v, OP_Integer, p
129f0 49 64 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  Idx->iDb, 0);.  
12a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
12a10 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
12a20 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75   iIdx, pIdx->tnu
12a30 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
12a40 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 49        (char*)&pI
12a50 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f  dx->keyInfo, P3_
12a60 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66  KEYINFO);.    if
12a70 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77  ( seekOp==OP_Rew
12a80 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ind ){.      sql
12a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12aa0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b   OP_Null, 0, 0);
12ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12ac0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
12ad0 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b  keRecord, 1, 0);
12ae0 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  .      seekOp = 
12af0 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d  OP_MoveGt;.    }
12b00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12b10 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
12b20 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
12b30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12b40 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20  v, OP_IdxRowid, 
12b50 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71  iIdx, 0);.    sq
12b60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12b70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
12b80 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12b90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12ba0 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20 30  _MoveGe, base, 0
12bb0 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e  );.  }.  eList.n
12bc0 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73  Expr = 1;.  mems
12bd0 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20 30  et(&eListItem, 0
12be0 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49 74  , sizeof(eListIt
12bf0 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20  em));.  eList.a 
12c00 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20  = &eListItem;.  
12c10 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72  eList.a[0].pExpr
12c20 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c 65   = pExpr;.  sele
12c30 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12c40 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20 30  se, p, &eList, 0
12c50 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73  , 0, 0, -1, eDes
12c60 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20 62  t, iParm, brk, b
12c70 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  rk, 0);.  sqlite
12c80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
12c90 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c  l(v, brk);.  sql
12ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12cb0 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
12cc0 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
12cd0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
12ce0 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
12cf0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
12d00 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54  ause in a SELECT
12d10 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
12d20 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
12d30 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
12d40 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52  ..**.** An ORDER
12d50 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
12d60 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  is a list of exp
12d70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e  ressions.  If an
12d80 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  y expression.** 
12d90 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
12da0 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61  nstant, then tha
12db0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
12dc0 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a  replaced by the.
12dd0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
12de0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65   entry in the re
12df0 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
12e00 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
12e10 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
12e20 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
12e30 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
12e40 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
12e50 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  CT statement. */
12e60 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
12e70 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20  derBy,   /* The 
12e80 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
12e90 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  P BY clause to b
12ea0 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
12eb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
12ec0 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72  pe     /* Either
12ed0 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
12ee0 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  UP", as appropri
12ef0 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
12f00 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
12f10 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
12f20 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ist;     /* The 
12f30 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
12f40 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61  e SELECT */.  Pa
12f50 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
12f60 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
12f70 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
12f80 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a   of the SELECT *
12f90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  /.  assert( pELi
12fa0 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72  st );..  if( pOr
12fb0 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
12fc0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
12fd0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
12fe0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
12ff0 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
13000 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
13010 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13020 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
13030 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
13040 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
13050 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
13060 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
13070 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13080 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
13090 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
130a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
130b0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
130c0 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
130d0 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
130e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
130f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13100 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
13110 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f         "%s BY co
13120 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
13130 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
13140 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
13150 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
13160 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20  and %d", zType, 
13170 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
13180 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
13190 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
131a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
131b0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
131c0 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29  Names(pNC, pE) )
131d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
131e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
131f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
13200 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20  stant(pE) ){.   
13210 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13220 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
13230 20 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d       "%s BY term
13240 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
13250 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
13260 6e 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  nts", zType);.  
13270 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13280 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13290 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
132a0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
132b0 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
132c0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
132d0 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
132e0 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
132f0 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
13300 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13310 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
13320 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
13330 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
13340 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
13350 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
13360 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
13370 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
13380 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
13390 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
133a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
133b0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
133c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
133d0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
133e0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
133f0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
13400 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
13410 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
13420 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
13430 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
13440 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
13450 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
13460 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
13470 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
13480 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
134a0 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
134b0 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
134c0 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
134d0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
134e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
134f0 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
13500 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
13510 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
13520 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
13530 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
13540 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
13550 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
13560 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
13570 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
13580 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
13590 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
135a0 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
135b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
135c0 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
135d0 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
135e0 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
135f0 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
13600 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
13610 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
13620 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
13630 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13640 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
13650 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
13660 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
13670 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
13680 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
13690 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
136a0 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
136b0 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
136c0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
136d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
136e0 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
136f0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
13700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13710 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
13720 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
13730 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
13740 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
13750 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
13760 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
13770 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
13780 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
13790 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
137a0 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  ntext..  */.  me
137b0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
137c0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
137d0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
137e0 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
137f0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
13800 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74  (&sNC, p->pLimit
13810 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ||.      sqlit
13820 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
13830 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66  es(&sNC, p->pOff
13840 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  set) ){.    retu
13850 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13860 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75  .  }..  /* Set u
13870 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
13880 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
13890 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e   to ExprResolveN
138a0 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ames() to.  ** r
138b0 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
138c0 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f  ssion-list..  */
138d0 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20  .  sNC.allowAgg 
138e0 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  = 1;.  sNC.pSrcL
138f0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
13900 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
13910 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73  terNC;..  /* Res
13920 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
13930 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
13940 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
13950 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45  EList;.  if( !pE
13960 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  List ) return SQ
13970 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f  LITE_ERROR;.  fo
13980 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
13990 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
139a0 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c    Expr *pX = pEL
139b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
139c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
139d0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
139e0 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
139f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13a00 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
13a10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
13a20 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
13a30 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
13a40 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
13a50 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
13a60 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
13a70 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
13a80 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
13a90 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
13aa0 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
13ab0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
13ac0 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42  Agg );.  pGroupB
13ad0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
13ae0 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
13af0 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b  || sNC.hasAgg ){
13b00 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20  .    p->isAgg = 
13b10 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
13b20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
13b30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
13b40 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
13b50 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
13b60 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
13b70 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
13b80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13b90 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75  Having && !pGrou
13ba0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
13bb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13bc0 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  e, "a GROUP BY c
13bd0 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
13be0 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22  d before HAVING"
13bf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13c00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
13c10 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78  .  /* Add the ex
13c20 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
13c30 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
13c40 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
13c50 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
13c60 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
13c70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
13c80 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
13c90 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73  that.  ** expres
13ca0 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
13cb0 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29  RE clause (etc.)
13cc0 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78   can refer to ex
13cd0 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a  pressions by.  *
13ce0 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65  * aliases in the
13cf0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
13d00 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69  *.  ** Minor poi
13d10 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74  nt: If this is t
13d20 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
13d30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  e expression wil
13d40 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61  l be.  ** re-eva
13d50 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
13d60 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
13d70 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69  .  */.  sNC.pELi
13d80 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
13d90 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13da0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
13db0 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c  NC, p->pWhere) |
13dc0 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  |.      sqlite3E
13dd0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
13de0 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
13df0 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
13e00 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
13e10 73 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  sNC, p->pOrderBy
13e20 2c 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20  , "ORDER") ||.  
13e30 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72      processOrder
13e40 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47  GroupBy(&sNC, pG
13e50 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29  roupBy, "GROUP")
13e60 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
13e70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13e80 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
13e90 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  re the GROUP BY 
13ea0 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
13eb0 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74  contain aggregat
13ec0 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  e functions..  *
13ed0 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  /.  if( pGroupBy
13ee0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
13ef0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
13f00 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28  tem;.  .    for(
13f10 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  i=0, pItem=pGrou
13f20 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70  pBy->a; i<pGroup
13f30 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
13f40 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
13f50 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
13f60 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  rty(pItem->pExpr
13f70 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20  , EP_Agg) ){.   
13f80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
13f90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67  rMsg(pParse, "ag
13fa0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13fb0 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
13fc0 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20  d in ".         
13fd0 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59     "the GROUP BY
13fe0 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20   clause");.     
13ff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14000 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
14010 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
14020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14030 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
14040 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
14050 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
14060 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
14070 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
14080 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
14090 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
140a0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
140b0 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
140c0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
140d0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
140e0 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
140f0 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
14100 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
14110 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
14120 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
14130 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
14140 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
14150 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
14160 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14170 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
14180 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
14190 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
141a0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
141b0 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
141c0 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
141d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
141e0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
141f0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
14200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14210 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
14220 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  ll, pAggInfo->aC
14230 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a  ol[i].iMem, 0);.
14240 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
14250 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
14260 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
14270 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
14280 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
14290 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
142a0 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e  OP_MemNull, pFun
142b0 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  c->iMem, 0);.   
142c0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
142d0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
142e0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
142f0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
14300 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
14310 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
14320 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
14330 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14340 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
14350 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
14360 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
14370 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
14380 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
14390 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
143a0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
143b0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
143c0 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
143d0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
143e0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
143f0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
14400 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
14410 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
14420 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
14430 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
14440 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
14470 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
14480 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
14490 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
144a0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
144b0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
144c0 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
144d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
144e0 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
144f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
14500 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
14510 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
14520 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
14530 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
14540 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
14550 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
14560 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14570 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
14580 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
14590 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
145a0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
145b0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
145c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
145d0 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
145e0 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69  >pList;.    sqli
145f0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
14600 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
14610 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
14620 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20  st->nExpr : 0,. 
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
14650 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45  pFunc, P3_FUNCDE
14660 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
14670 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
14680 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
14690 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
146a0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
146b0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
146c0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
146d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
146e0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
146f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
14700 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
14710 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
14720 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
14730 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14740 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
14750 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
14760 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
14770 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
14780 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
14790 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
147a0 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
147b0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
147c0 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
147d0 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
147e0 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 45  rNext = 0;.    E
147f0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
14800 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
14810 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
14820 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
14830 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
14840 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14850 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
14860 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
14870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
14880 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rg = 0;.    }.  
14890 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
148a0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
148b0 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
148c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
148d0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
148e0 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
148f0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
14900 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  v, pF->iDistinct
14910 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 32  , addrNext, 1, 2
14920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14930 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64   pF->pFunc->need
14940 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
14950 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
14960 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
14970 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
14980 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
14990 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
149a0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
149b0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
149c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  pList->nExpr; j+
149d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
149e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
149f0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
14a00 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
14a10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
14a20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
14a30 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
14a40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
14a50 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
14a60 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
14a70 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
14a80 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
14a90 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
14aa0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
14ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
14ac0 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  (v, OP_AggStep, 
14ad0 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c 20  pF->iMem, nArg, 
14ae0 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
14af0 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P3_FUNCDEF);. 
14b00 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
14b10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14b20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
14b30 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
14b40 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
14b50 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
14b60 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
14b70 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
14b80 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
14b90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14ba0 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
14bb0 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
14bc0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14bd0 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69 4d  MemStore, pC->iM
14be0 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70 41  em, 1);.  }.  pA
14bf0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
14c00 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  de = 0;.}.../*.*
14c10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14c20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 45  for the given SE
14c30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
14c40 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
14c50 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65  s are distribute
14c60 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79  d in various way
14c70 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  s depending on t
14c80 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65  he.** value of e
14c90 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a  Dest and iParm..
14ca0 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74 20  **.**     eDest 
14cb0 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73 75  Value       Resu
14cc0 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
14cd0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d00 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
14d10 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76  _Callback    Inv
14d20 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  oke the callback
14d30 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
14d40 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
14d50 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
14d60 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69 72         Store fir
14d70 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d  st result in mem
14d80 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a  ory cell iParm.*
14d90 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74  *.**     SRT_Set
14da0 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 72           Store r
14db0 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20 6f  esults as keys o
14dc0 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a  f table iParm..*
14dd0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69  *.**     SRT_Uni
14de0 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  on       Store r
14df0 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20  esults as a key 
14e00 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
14e10 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  able iParm.**.**
14e20 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74 20       SRT_Except 
14e30 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73 75       Remove resu
14e40 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65 6d  lts from the tem
14e50 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
14e60 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
14e70 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
14e80 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
14e90 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
14ea0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Parm.**.** The t
14eb0 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69 6e  able above is in
14ec0 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69 74  complete.  Addit
14ed0 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c 75  ional eDist valu
14ee0 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64 0a  e have be added.
14ef0 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  ** since this co
14f00 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74 65  mment was writte
14f10 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c 65  n.  See the sele
14f20 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75  ctInnerLoop() fu
14f30 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20  nction for.** a 
14f40 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e 67  complete listing
14f50 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64 20   of the allowed 
14f60 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74 20  values of eDest 
14f70 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69 6e  and their meanin
14f80 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  gs..**.** This r
14f90 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
14fa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
14fb0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
14fc0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
14fd0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
14fe0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
14ff0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
15000 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
15010 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
15020 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
15030 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
15040 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
15050 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
15060 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
15070 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
15080 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  hat..**.** The p
15090 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61  Parent, parentTa
150a0 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74 41  b, and *pParentA
150b0 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66 69  gg fields are fi
150c0 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73 0a  lled in if this.
150d0 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20 73  ** SELECT is a s
150e0 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 72  ubquery.  This r
150f0 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20 74  outine may try t
15100 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20 53  o combine this S
15110 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69 74  ELECT.** with it
15120 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d  s parent to form
15130 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 71   a single flat q
15140 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69  uery.  In so doi
15150 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20  ng, it might.** 
15160 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65 6e  change the paren
15170 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20 6e  t query from a n
15180 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f 20  on-aggregate to 
15190 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
151a0 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20  ry..** For that 
151b0 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61 72  reason, the pPar
151c0 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20 70  entAgg flag is p
151d0 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74  assed as a point
151e0 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e  er, so it.** can
151f0 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a   be changed..**.
15200 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 20  ** Example 1:   
15210 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
15220 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
15230 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  eter..**.**    S
15240 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
15250 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c 20  JOIN (SELECT x, 
15260 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
15270 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20  ) JOIN t3;.**   
15280 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
15290 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
152a0 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
152b0 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20  _/        /.**  
152c0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20            /.**  
15300 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
15310 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
15320 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
15330 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a  _________/.**.**
15340 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15350 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
15360 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72 73  outer query firs
15370 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63 61  t.   For that ca
15380 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77  ll,.** pParent w
15390 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75  ill be NULL.  Du
153a0 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73 73  ring the process
153b0 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ing of the outer
153c0 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a   query, this .**
153d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
153e0 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20 74  ed recursively t
153f0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75 62  o handle the sub
15400 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65 20  query.  For the 
15410 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c  recursive.** cal
15420 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  l, pParent will 
15430 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  point to the out
15440 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61 75  er query.  Becau
15450 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  se the subquery 
15460 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64  is.** the second
15470 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74 68   element in a th
15480 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68  ree-way join, th
15490 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72 61  e parentTab para
154a0 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65  meter will.** be
154b0 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c 75   1 (the 2nd valu
154c0 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65 64  e of a 0-indexed
154d0 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20   array.).*/.int 
154e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
154f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15510 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
15520 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
15530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15540 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15550 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
15560 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
15570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
15580 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
15590 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
155a0 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
155b0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61 72          /* A par
155c0 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20 74  ameter used by t
155d0 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73 61  he eDest disposa
155e0 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65  l method */.  Se
155f0 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20 20  lect *pParent,  
15600 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
15610 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63 68  SELECT for which
15620 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d 71   this is a sub-q
15630 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61  uery */.  int pa
15640 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20 20  rentTab,        
15650 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50 61   /* Index in pPa
15660 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74 68  rent->pSrc of th
15670 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  is query */.  in
15680 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 20  t *pParentAgg,  
15690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
156a0 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67 67  pParent uses agg
156b0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
156c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156e0 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f  If eDest is SRT_
156f0 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e  Union, the affin
15700 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
15710 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
15720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15730 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
15740 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
15750 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
15760 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
15770 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
15780 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
15790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
157a0 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
157b0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
157c0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
157d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
157e0 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
157f0 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
15800 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
15810 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
15820 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
15830 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
15840 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
15850 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
15860 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
15870 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
15880 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
15890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
158a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
158b0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
158c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
158d0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
158e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
158f0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
15900 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
15910 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
15920 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
15930 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
15940 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
15950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15960 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
15970 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
15980 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
15990 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
159a0 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
159b0 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
159c0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
159d0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
159e0 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
159f0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
15a00 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
15a10 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
15a20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
15a30 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
15a40 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
15a50 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
15a60 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
15a70 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  an OP_OpenVirtua
15a80 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
15a90 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
15aa0 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
15ab0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
15ac0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
15ad0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
15ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15af0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
15b00 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
15b10 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69  y */..  if( sqli
15b20 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
15b30 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
15b40 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29  ->nErr || p==0 )
15b50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
15b60 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
15b70 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
15b80 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
15b90 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
15ba0 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
15bb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
15bc0 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  Info));..#ifndef
15bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
15be0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
15bf0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
15c00 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
15c10 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
15c20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
15c30 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
15c40 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
15c50 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
15c60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
15c70 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  lect *pLoop;.   
15c80 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
15c90 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
15ca0 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
15cb0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
15cc0 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
15cd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
15ce0 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
15cf0 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
15d00 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a  t, iParm, aff);.
15d10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f    }.#endif..  pO
15d20 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
15d30 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
15d40 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
15d50 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
15d60 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
15d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
15d80 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
15d90 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
15da0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
15db0 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72  .  }.  p->pOrder
15dc0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
15dd0 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
15de0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
15df0 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
15e00 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
15e10 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
15e20 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
15e30 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
15e40 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
15e50 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
15e60 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
15e70 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a  Agg = p->isAgg;.
15e80 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
15e90 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
15ea0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
15eb0 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
15ec0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
15ed0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
15ee0 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
15ef0 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
15f00 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
15f10 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
15f20 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
15f30 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
15f40 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
15f50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
15f60 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
15f70 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
15f80 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
15f90 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
15fa0 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
15fb0 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
15fc0 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
15fd0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
15fe0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
15ff0 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d  RY.  if( (eDest=
16000 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73  =SRT_Mem || eDes
16010 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70  t==SRT_Set) && p
16020 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  EList->nExpr>1 )
16030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16040 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
16050 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
16060 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
16070 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
16080 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
16090 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
160a0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c  ");.    goto sel
160b0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
160c0 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20  dif..  /* ORDER 
160d0 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  BY is ignored fo
160e0 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69  r some destinati
160f0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
16100 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
16110 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (eDest) ){.    p
16120 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
16130 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
16140 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
16150 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
16160 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16170 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
16180 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
16190 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
161a0 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77 65  lumn names if we
161b0 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74   will be using t
161c0 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61 63  hem in a callbac
161d0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73 74  k.  This.  ** st
161e0 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ep is skipped if
161f0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67   the output is g
16200 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74 68  oing to some oth
16210 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  er destination..
16220 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
16230 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
16240 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
16250 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
16260 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
16270 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
16280 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16290 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
162a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
162b0 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  use.  */.#if !de
162c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
162d0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
162e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
162f0 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28  MIT_VIEW).  for(
16300 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
16310 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
16320 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
16330 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
16340 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   0;.    int need
16350 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a  RestoreContext;.
16360 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
16370 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
16380 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
16390 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ;..    if( pItem
163a0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ->pSelect==0 ) c
163b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
163c0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
163d0 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64   ){.      zSaved
163e0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
163f0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16400 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  xt;.      pParse
16410 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
16420 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
16430 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
16440 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20  Context = 1;.   
16450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65   }else{.      ne
16460 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
16470 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
16480 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16490 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
164a0 6c 65 63 74 2c 20 53 52 54 5f 56 69 72 74 75 61  lect, SRT_Virtua
164b0 6c 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20 20  lTab, .         
164c0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
164d0 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69  Cursor, p, i, &i
164e0 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  sAgg, 0);.    if
164f0 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e  ( needRestoreCon
16500 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50  text ){.      pP
16510 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
16520 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
16530 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ontext;.    }.  
16540 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
16550 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65  pSrc;.    pWhere
16560 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
16570 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
16580 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20 29  Orderby(eDest) )
16590 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  {.      pOrderBy
165a0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
165b0 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70      }.    pGroup
165c0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
165d0 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20  ;.    pHaving = 
165e0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20  p->pHaving;.    
165f0 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
16600 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  isDistinct;.  }.
16610 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
16620 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ck for the speci
16630 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e  al case of a min
16640 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63  () or max() func
16650 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20  tion by itself. 
16660 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
16670 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
16680 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  ( simpleMinMaxQu
16690 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65  ery(pParse, p, e
166a0 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a  Dest, iParm) ){.
166b0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
166c0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
166d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
166e0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
166f0 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74 68  is a subquery th
16700 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74  at can be "flatt
16710 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70  ened" into its p
16720 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66  arent..  ** If f
16730 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70  lattening is a p
16740 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f  ossiblity, do so
16750 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
16760 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a  diately.  .  */.
16770 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16780 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
16790 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e  Parent && pParen
167a0 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c  tAgg &&.      fl
167b0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
167c0 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20 70  arse, pParent, p
167d0 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72 65  arentTab, *pPare
167e0 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29 7b  ntAgg, isAgg) ){
167f0 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
16800 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20 31   *pParentAgg = 1
16810 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  ;.    goto selec
16820 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
16830 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  f..  /* If there
16840 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
16850 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65 20  clause, resolve 
16860 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  any collation se
16870 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61 6d  quences.  ** nam
16880 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
16890 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  n explicitly spe
168a0 63 69 66 69 65 64 20 61 6e 64 20 63 72 65 61 74  cified and creat
168b0 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  e a sorting inde
168c0 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  x..  **.  ** Thi
168d0 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  s sorting index 
168e0 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
168f0 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
16900 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
16910 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
16920 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
16930 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
16940 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
16950 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69 72  .  ** OP_OpenVir
16960 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  tual instruction
16970 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
16980 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
16990 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
169a0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
169b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
169c0 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
169d0 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
169e0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
169f0 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
16a00 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
16a10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
16a20 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  erBy ){.    stru
16a30 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16a40 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79   *pTerm;.    Key
16a50 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
16a60 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65      for(i=0, pTe
16a70 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  rm=pOrderBy->a; 
16a80 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
16a90 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  r; i++, pTerm++)
16aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
16ab0 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
16ac0 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72      pTerm->pExpr
16ad0 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->pColl = sqlite
16ae0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
16af0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e  Parse, pTerm->zN
16b00 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
16b10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16b20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
16b30 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
16b40 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
16b50 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
16b60 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
16b70 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
16b80 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
16b90 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
16ba0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
16bb0 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
16bc0 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
16bd0 65 78 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  ex =.       sqli
16be0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
16bf0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 4f  _OpenVirtual, pO
16c00 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
16c10 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
16c20 72 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20  r+2, .          
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16c40 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
16c50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
16c60 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
16c70 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
16c80 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   -1;.  }..  /* S
16c90 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
16ca0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
16cb0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16cc0 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
16cd0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
16ce0 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
16cf0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
16d00 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
16d10 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
16d20 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
16d30 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
16d40 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56  if( eDest==SRT_V
16d50 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20  irtualTab ){.   
16d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d70 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  p(v, OP_OpenVirt
16d80 75 61 6c 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69  ual, iParm, pELi
16d90 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
16da0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
16db0 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
16dc0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
16dd0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
16de0 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
16df0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
16e00 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74  eyInfo;.    dist
16e10 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
16e20 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
16e30 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
16e40 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
16e50 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
16e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
16e70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
16e80 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
16e90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16ea0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16eb0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
16ec0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
16ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
16ee0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
16ef0 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  .  /* Aggregate 
16f00 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  and non-aggregat
16f10 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61  e queries are ha
16f20 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
16f30 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67  y */.  if( !isAg
16f40 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
16f50 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16f60 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d  case is for non-
16f70 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
16f80 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74  s.    ** Begin t
16f90 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
16fa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e  .    */.    pWIn
16fb0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
16fc0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
16fd0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
16fe0 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20   &pOrderBy);.   
16ff0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
17000 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17010 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
17020 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
17030 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
17040 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 56 69   prior OP_OpenVi
17050 72 74 75 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  rtual .    ** in
17060 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
17070 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
17080 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
17090 20 74 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74   the OP_OpenVirt
170a0 75 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ual.    ** into 
170b0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
170c0 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
170d0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
170e0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
170f0 20 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74      uncreateSort
17100 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
17110 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b   addrSortIndex);
17120 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
17130 65 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a  enVirt[2] = -1;.
17140 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
17150 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
17160 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f  nner loop.    */
17170 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49  .    if( selectI
17180 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
17190 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30   p, pEList, 0, 0
171a0 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74  , pOrderBy, dist
171b0 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20  inct, eDest,.   
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e   iParm, pWInfo->
171e0 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
171f0 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20  o->iBreak, aff) 
17200 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ){.       goto s
17210 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
17220 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
17230 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
17240 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
17250 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
17260 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
17270 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
17280 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
17290 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75  for aggregate qu
172a0 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d  eries */.    Nam
172b0 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
172c0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
172d0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
172e0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
172f0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
17300 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
17310 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
17320 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
17330 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
17340 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
17350 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
17360 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
17370 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
17380 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
17390 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
173a0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
173b0 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
173c0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
173d0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
17400 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
17410 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
17420 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
17430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
17440 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
17450 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
17460 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
17470 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
17480 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
17490 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
174a0 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
174b0 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
174c0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
174d0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
174e0 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  ...    /* The fo
174f0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
17500 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73  s hold addresses
17510 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70   or labels for p
17520 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  arts of the.    
17530 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
17540 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72  ne program we ar
17550 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68  e putting togeth
17560 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
17570 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20  drOutputRow;    
17580 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
17590 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
175a0 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
175b0 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ow */.    int ad
175c0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20  drSetAbort;     
175d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
175e0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
175f0 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  rn */.    int ad
17600 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
17610 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f  ; /* Start of co
17620 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  de that initiali
17630 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f  zes the input lo
17640 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  op */.    int ad
17650 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20  drTopOfLoop;    
17660 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
17670 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
17680 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42    int addrGroupB
17690 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64  yChange;  /* Cod
176a0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
176b0 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65   any GROUP BY te
176c0 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  rm changes */.  
176d0 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73    int addrProces
176e0 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64  sRow;     /* Cod
176f0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73  e to process a s
17700 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20  ingle input row 
17710 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
17720 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd;            /
17730 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f  * End of all pro
17740 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  cessing */.    i
17750 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
17760 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50  x;     /* The OP
17770 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 66 6f 72  _OpenVirtual for
17780 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
17790 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  ex */.    int ad
177a0 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20 20  drReset;        
177b0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
177c0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
177d0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
177e0 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  ..    addrEnd = 
177f0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17800 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
17810 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
17820 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
17830 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
17840 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
17850 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
17860 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
17870 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
17880 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
17890 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
178a0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
178b0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
178c0 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
178d0 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
178e0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
178f0 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
17900 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
17910 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
17920 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
17930 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
17940 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
17950 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
17960 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41  pr+1 : 0;.    sA
17970 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20  ggInfo.pGroupBy 
17980 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = pGroupBy;.    
17990 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
179a0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
179b0 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a 20  NC, pEList) ){. 
179c0 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
179d0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
179e0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41  if( sqlite3ExprA
179f0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
17a00 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20 29 7b  NC, pOrderBy) ){
17a10 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
17a20 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
17a30 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
17a40 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
17a50 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
17a60 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  NC, pHaving) ){.
17a70 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
17a80 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
17a90 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
17aa0 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
17ab0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
17ac0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
17ad0 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
17ae0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17af0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
17b00 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
17b10 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
17b20 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  r->pList) ){.   
17b30 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
17b40 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
17b50 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
17b60 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63  te3Tsd()->malloc
17b70 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
17b80 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
17b90 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
17ba0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
17bb0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
17bc0 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
17bd0 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
17be0 20 63 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67   complex tha agg
17bf0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
17c00 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
17c10 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
17c20 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
17c30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
17c40 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
17c50 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
17c60 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
17c70 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  /..      /* Crea
17c80 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77  te labels that w
17c90 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  e will be needin
17ca0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
17cb0 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69  .      addrIniti
17cc0 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69  alizeLoop = sqli
17cd0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17ce0 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47  (v);.      addrG
17cf0 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73  roupByChange = s
17d00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17d10 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64  bel(v);.      ad
17d20 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73  drProcessRow = s
17d30 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17d40 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  bel(v);..      /
17d50 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
17d60 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
17d70 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
17d80 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
17d90 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
17da0 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
17db0 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
17dc0 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
17dd0 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
17de0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
17df0 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
17e00 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56 69   all, the OpenVi
17e10 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
17e20 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
17e30 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
17e40 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
17e50 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
17e60 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
17e70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17e80 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
17e90 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
17ea0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
17eb0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61  roupBy);.      a
17ec0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a  ddrSortingIdx =.
17ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17ee0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
17ef0 70 65 6e 56 69 72 74 75 61 6c 2c 20 73 41 67 67  penVirtual, sAgg
17f00 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
17f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f20 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
17f30 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
17f40 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
17f50 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17f60 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
17f70 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
17f80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
17f90 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
17fa0 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
17fb0 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
17fc0 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
17fd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
17fe0 65 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e  eFlag = pParse->
17ff0 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41  nMem++;.      iA
18000 62 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73  bortFlag = pPars
18010 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
18020 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
18030 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
18040 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
18050 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
18060 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
18070 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
18080 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
18090 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
180a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
180b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
180c0 6d 49 6e 74 2c 20 30 2c 20 69 41 62 6f 72 74 46  mInt, 0, iAbortF
180d0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
180e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63  Comment((v, "# c
180f0 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
18100 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18110 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18120 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 55 73 65  _MemInt, 0, iUse
18130 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
18140 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
18150 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
18160 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
18170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18180 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
18190 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  , 0, addrInitial
181a0 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20  izeLoop);..     
181b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
181c0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
181d0 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
181e0 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
181f0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
18200 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
18210 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
18220 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
18230 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
18240 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
18250 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
18260 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
18270 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
18280 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
18290 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
182a0 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
182b0 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
182c0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
182d0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
182e0 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
182f0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
18300 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
18310 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
18320 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
18330 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
18340 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
18350 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
18360 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18370 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
18380 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18390 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 41  OP_MemInt, 1, iA
183a0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
183b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
183c0 20 22 23 20 73 65 74 20 61 62 6f 72 74 20 66 6c   "# set abort fl
183d0 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
183e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
183f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
18400 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
18410 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
18420 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18430 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
18440 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18450 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46  _IfMemPos, iUseF
18460 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
18470 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
18480 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
18490 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
184a0 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
184b0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
184c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
184d0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
184e0 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c   0);.      final
184f0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
18500 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
18510 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  o);.      if( pH
18520 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
18530 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
18540 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
18550 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
18560 6f 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  ow+1, 1);.      
18570 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  }.      rc = sel
18580 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
18590 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
185a0 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
185b0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
185d0 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69  stinct, eDest, i
185e0 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
18610 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c  1, addrSetAbort,
18620 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
18630 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
18640 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
18660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18670 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
18680 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
18690 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 6e 64  mment((v, "# end
186a0 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
186b0 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
186c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
186d0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
186e0 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
186f0 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
18700 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
18710 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
18720 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18730 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
18740 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
18750 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
18760 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
18770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18780 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
18790 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  0);..      /* Be
187a0 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
187b0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
187c0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
187d0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
187e0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
187f0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
18800 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
18810 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
18820 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
18830 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
18840 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
18850 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
18860 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
18870 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
18880 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
18890 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
188a0 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
188b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
188c0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
188d0 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
188e0 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
188f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18900 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
18910 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
18920 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
18930 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
18940 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
18950 65 2c 20 26 70 47 72 6f 75 70 42 79 29 3b 0a 20  e, &pGroupBy);. 
18960 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
18970 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
18980 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
18990 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
189a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
189b0 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
189c0 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
189d0 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
189e0 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
189f0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
18a00 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
18a10 4f 70 65 6e 56 69 72 74 75 61 6c 20 74 61 62 6c  OpenVirtual tabl
18a20 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
18a30 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
18a40 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
18a50 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
18a60 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
18a70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18a80 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
18a90 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
18aa0 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
18ab0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
18ac0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
18ad0 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
18ae0 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
18af0 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
18b00 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
18b10 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
18b20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
18b30 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
18b40 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
18b50 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
18b60 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
18b70 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
18b80 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
18b90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
18ba0 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
18bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
18bc0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
18bd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18be0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
18bf0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
18c00 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
18c10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18c20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67  OP_Sequence, sAg
18c30 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
18c40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  , 0);.        j 
18c50 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
18c60 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r+1;.        for
18c70 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
18c80 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
18c90 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
18ca0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
18cb0 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
18cc0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
18cd0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
18ce0 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f  terColumn<j ) co
18cf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
18d00 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 43 6f 6c    if( pCol->iCol
18d10 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
18d20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d30 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
18d40 64 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  d, pCol->iTable,
18d50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
18d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18d80 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
18d90 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70   pCol->iTable, p
18da0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  Col->iColumn);. 
18db0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18dc0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
18dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
18de0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18df0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a  OP_MakeRecord, j
18e00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
18e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18e20 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
18e30 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
18e40 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
18e50 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
18e60 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
18e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18e80 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73  Op(v, OP_Sort, s
18e90 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
18ea0 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
18eb0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18ec0 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42  t((v, "# GROUP B
18ed0 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
18ee0 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
18ef0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
18f00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
18f10 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
18f20 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
18f30 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
18f40 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
18f50 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
18f60 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
18f70 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
18f80 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
18f90 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
18fa0 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
18fb0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
18fc0 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
18fd0 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
18fe0 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
18ff0 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
19000 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
19010 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
19020 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
19030 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
19040 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19050 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
19060 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
19070 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
19080 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19090 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
190a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
190b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
190c0 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
190d0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29  o.sortingIdx, j)
190e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
190f0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
19100 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
19110 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
19120 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
19130 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
19140 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
19150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
19160 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19170 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
19180 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75  iBMem+j, j<pGrou
19190 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  pBy->nExpr-1);. 
191a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
191b0 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (j=pGroupBy->nEx
191c0 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  pr-1; j>=0; j--)
191d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  {.        if( j<
191e0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
191f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
19200 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19210 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69  v, OP_MemLoad, i
19220 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20  BMem+j, 0);.    
19230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
19240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19250 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41  , OP_MemLoad, iA
19260 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+j, 0);.     
19270 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20     if( j==0 ){. 
19280 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19290 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
192a0 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50  Eq, 0x200, addrP
192b0 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
192c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
192d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
192e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
192f0 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70  0x200, addrGroup
19300 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
19310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
19320 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
19330 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
19340 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
19350 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P3_COLLSEQ);.
19360 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
19370 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19380 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
19390 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
193a0 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
193b0 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20  * Change in the 
193c0 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
193d0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
193e0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
193f0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
19400 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
19410 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
19420 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
19430 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
19440 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
19450 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
19460 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
19470 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
19480 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
19490 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
194a0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
194b0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
194c0 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
194d0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
194e0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
194f0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
19500 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
19510 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
19520 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
19530 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
19540 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
19550 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
19560 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
19570 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
19580 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
19590 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
195a0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65  Op(v, OP_MemMove
195b0 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d  , iAMem+j, iBMem
195c0 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
195d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
195e0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
195f0 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
19600 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
19610 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
19620 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
19630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19640 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
19650 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  emPos, iAbortFla
19660 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
19670 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19680 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72  v, "# check abor
19690 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
196a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
196b0 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
196c0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
196d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
196e0 28 76 2c 20 22 23 20 72 65 73 65 74 20 61 63 63  (v, "# reset acc
196f0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
19700 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
19710 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
19720 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
19730 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
19740 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
19750 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
19760 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
19770 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
19780 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52  (v, addrProcessR
19790 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  ow);.      updat
197a0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
197b0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
197c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
197d0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
197e0 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61  mInt, 1, iUseFla
197f0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
19800 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64  mment((v, "# ind
19810 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
19820 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
19830 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
19840 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
19850 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
19860 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
19870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19880 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  Op(v, OP_Next, s
19890 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
198a0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
198b0 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
198c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
198d0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
198e0 3b 0a 20 20 20 20 20 20 20 20 75 6e 63 72 65 61  ;.        uncrea
198f0 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
19900 50 61 72 73 65 2c 20 61 64 64 72 53 6f 72 74 69  Parse, addrSorti
19910 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
19920 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
19930 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
19940 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
19950 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
19960 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
19970 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
19980 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
19990 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
199a0 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72  # output final r
199b0 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20  ow"));.      .  
199c0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
199d0 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73  oupBy */.    els
199e0 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  e {.      /* Thi
199f0 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
19a00 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
19a10 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
19a20 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
19a30 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
19a40 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
19a50 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
19a60 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
19a70 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
19a80 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
19a90 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
19aa0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
19ab0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
19ac0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
19ad0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
19ae0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
19af0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19b00 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
19b10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
19b20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
19b30 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
19b40 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
19b50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
19b60 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69  WInfo);.      fi
19b70 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
19b80 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
19b90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72  Info);.      pOr
19ba0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
19bb0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
19bc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19bd0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
19be0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
19bf0 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  End, 1);.      }
19c00 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
19c10 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
19c20 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
19c30 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20  0, 0, -1, .     
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
19c60 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c  ddrEnd, addrEnd,
19c70 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20   aff);.    }.   
19c80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
19c90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
19ca0 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
19cb0 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
19cc0 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
19cd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
19ce0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
19cf0 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
19d00 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
19d10 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
19d20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
19d30 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
19d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
19d50 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
19d60 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
19d70 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
19d80 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
19d90 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69   iParm);.  }..#i
19da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19db0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
19dc0 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
19dd0 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
19de0 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
19df0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
19e00 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
19e10 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65   table.  So dele
19e20 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  te the subquery 
19e30 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
19e40 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74  he parent.  ** t
19e50 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73  o prevent this s
19e60 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
19e70 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
19e80 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
19e90 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  the.  ** the use
19ea0 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
19eb0 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
19ec0 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
19ed0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
19ee0 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70  nt->pSrc->nSrc>p
19ef0 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20  arentTab );.    
19f00 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
19f10 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
19f20 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29  ab].pSelect==p )
19f30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
19f40 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  ectDelete(p);.  
19f50 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
19f60 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
19f70 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  elect = 0;.  }.#
19f80 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70  endif..  /* Jump
19f90 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
19fa0 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
19fb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19fc0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
19fd0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
19fe0 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
19ff0 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
1a000 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1a010 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
1a020 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
1a030 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
1a040 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
1a050 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
1a060 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1a070 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
1a080 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
1a090 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
1a0a0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
1a0b0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
1a0c0 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1a0d0 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
1a0e0 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f  iteFree(sAggInfo
1a0f0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
1a100 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.