/ Hex Artifact Content
Login

Artifact 4e9072092ddba113acf3c8192152ae9e75a23702:


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 39 37  select.c,v 1.297
0200: 20 32 30 30 36 2f 30 31 2f 32 31 20 32 32 3a 31   2006/01/21 22:1
0210: 39 3a 35 35 20 64 72 68 20 45 78 70 20 24 0a 2a  9:55 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 0a 20 20 50 61  OntoSorter(.  Pa
2c40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2c50: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
2c60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
2c70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2c80: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
2c90: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53  BY clause */.  S
2ca0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
2cb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
2cc0: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
2cd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
2ce0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2cf0: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  dbe;.  sqlite3Ex
2d00: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2d10: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
2d20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65  ddOp(v, OP_Seque
2d40: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
2d50: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73  ECursor, 0);.  s
2d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2d70: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64  v, OP_Pull, pOrd
2d80: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c  erBy->nExpr + 1,
2d90: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2da0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
2db0: 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72  keRecord, pOrder
2dc0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30  By->nExpr + 2, 0
2dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2de0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
2df0: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
2e00: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
2e10: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
2e20: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
2e30: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
2e40: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
2e50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2e60: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
2e70: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31  Select->iLimit+1
2e80: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2e90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2ea0: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 53  _MemIncr, -1, pS
2eb0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 29  elect->iLimit+1)
2ec0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
2ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2ee0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
2ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f00: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2f10: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
2f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f30: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
2f40: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
2f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f60: 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  Op(v, OP_Delete,
2f70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
2f80: 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  sor, 0);.    sql
2f90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2fa0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
2fb0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
2fc0: 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = -1;.  }.}../*.
2fd0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2fe0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2ff0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3000: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3010: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3020: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3030: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3040: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3050: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3060: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3070: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3080: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3090: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
30a0: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
30b0: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ent record */.  
30c0: 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20  int nPop        
30d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
30e0: 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63  imes to pop stac
30f0: 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a  k when jumping *
3100: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
3110: 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e  ffset>=0 && iCon
3120: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3130: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3150: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
3160: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3170: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3190: 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f  _IfMemNeg, p->iO
31a0: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 69  ffset, 0);.    i
31b0: 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20  f( nPop>0 ){.   
31c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
31e0: 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Pop, 0);.    }. 
31f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3200: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3210: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
3220: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
3230: 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45  v, "# skip OFFSE
3240: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
3250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3260: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
3270: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3280: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3290: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
32a0: 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  re the top N ele
32b0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ments of the.** 
32c0: 73 74 61 63 6b 20 61 72 65 20 64 69 73 74 69 6e  stack are distin
32d0: 63 74 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ct.  iTab is a s
32e0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
32f0: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3300: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
3310: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3320: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3330: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3340: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3350: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3360: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3370: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3380: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3390: 20 74 68 65 20 4b 20 76 61 6c 75 65 73 20 61 72   the K values ar
33a0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
33b0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
33c0: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
33d0: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
33e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
33f0: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
3400: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3410: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3420: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3430: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  VM */.  int iTab
3440: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
3450: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
3460: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
3470: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
3480: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
3490: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
34a0: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
34b0: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
34d0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
34e0: 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 6d  s of the stack m
34f0: 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 74 20  ust be distinct 
3500: 2a 2f 0a 20 20 69 6e 74 20 4b 20 20 20 20 20 20  */.  int K      
3510: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 20 4b          /* Pop K
3520: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74   elements from t
3530: 68 65 20 73 74 61 63 6b 20 69 66 20 69 6e 64 69  he stack if indi
3540: 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 23 69 66  stinct */.){.#if
3550: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3560: 54 49 4e 43 54 0a 20 20 73 71 6c 69 74 65 33 56  TINCT.  sqlite3V
3570: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
3580: 73 4e 75 6c 6c 2c 20 2d 4e 2c 20 73 71 6c 69 74  sNull, -N, sqlit
3590: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35a0: 72 28 76 29 2b 36 29 3b 0a 23 65 6e 64 69 66 0a  r(v)+6);.#endif.
35b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35c0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
35d0: 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73  ord, -N, 0);.  s
35e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
35f0: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
3600: 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62  iTab, sqlite3Vdb
3610: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
3620: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
3630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
3640: 2c 20 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , K, 0);.  sqlit
3650: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3660: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52  P_Goto, 0, addrR
3670: 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f  epeat);.  VdbeCo
3680: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
3690: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
36a0: 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74  ords"));.  sqlit
36b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
36c0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
36d0: 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  b, 0);.}.../*.**
36e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
36f0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
3700: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
3710: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3720: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
3730: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
3740: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
3750: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
3760: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
3770: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
3780: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
3790: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
37a0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
37b0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
37c0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
37d0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
37e0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
37f0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
3800: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
3810: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
3820: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3830: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
3840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3850: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3860: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
3870: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
3880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3890: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
38a0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
38b0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
38c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
38d0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
38e0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
38f0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
3900: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
3910: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
3920: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
3930: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
3940: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
3950: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3960: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
3970: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
3980: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3990: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
39a0: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
39b0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
39c0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
39d0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
39e0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
39f0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
3a00: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
3a10: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
3a20: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
3a30: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
3a40: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
3a50: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
3a60: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
3a70: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
3a80: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
3a90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
3ab0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
3ac0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
3ad0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3af0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3b00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3b10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
3b20: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
3b30: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
3b40: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
3b50: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
3b60: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3b70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3b80: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
3b90: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
3ba0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3bb0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3bc0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
3bd0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
3be0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
3bf0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3c00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
3c10: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
3c20: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3c30: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3c40: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3c50: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3c60: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3c70: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61  utput..  */.  ha
3c80: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
3c90: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3ca0: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
3cb0: 70 72 3e 30 3b 0a 20 20 69 66 28 20 70 4f 72 64  pr>0;.  if( pOrd
3cc0: 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44  erBy==0 && !hasD
3cd0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63  istinct ){.    c
3ce0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
3cf0: 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29 3b 0a 20  iContinue, 0);. 
3d00: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
3d10: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
3d20: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mns..  */.  if( 
3d30: 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20  nColumn>0 ){.   
3d40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
3d50: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
3d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3d70: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
3d80: 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20 20  srcTab, i);.    
3d90: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
3da0: 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74 2d  Column = pEList-
3db0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69  >nExpr;.    sqli
3dc0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
3dd0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
3de0: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  st);.  }..  /* I
3df0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
3e00: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
3e10: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
3e20: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
3e30: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
3e40: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
3e50: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
3e60: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
3e70: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
3e80: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
3e90: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
3ea0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 4c 69      int n = pELi
3eb0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 63  st->nExpr;.    c
3ec0: 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20 64  odeDistinct(v, d
3ed0: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
3ee0: 75 65 2c 20 6e 2c 20 6e 2b 31 29 3b 0a 20 20 20  ue, n, n+1);.   
3ef0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
3f00: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
3f10: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
3f20: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  inue, nColumn);.
3f30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
3f40: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
3f50: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
3f60: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
3f70: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
3f80: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
3f90: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
3fa0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
3fb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
3fc0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
3fd0: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
3fe0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
3ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4000: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
4010: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
4020: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
4030: 43 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  CT);.      if( a
4040: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
4050: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4060: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
4070: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4080: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4090: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
40a0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
40b0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
40c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
40d0: 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f  Construct a reco
40e0: 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72  rd from the quer
40f0: 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e  y result, but in
4100: 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20  stead of.    ** 
4110: 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f  saving that reco
4120: 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20  rd, use it as a 
4130: 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c  key to delete el
4140: 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20  ements from.    
4150: 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ** the temporary
4160: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
4170: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4180: 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20  T_Except: {.    
4190: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
41a0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
41b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
41c0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
41d0: 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53  umn, NULL_ALWAYS
41e0: 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20  _DISTINCT);.    
41f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
4200: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66  ngeP3(v, -1, aff
4210: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
4220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4230: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  ddOp(v, OP_NotFo
4240: 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61 64 64 72  und, iParm, addr
4250: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
4260: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4270: 50 5f 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  P_Delete, iParm,
4280: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
4290: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
42a0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
42b0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
42c0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
42d0: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
42e0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
42f0: 20 20 20 63 61 73 65 20 53 52 54 5f 56 69 72 74     case SRT_Virt
4300: 75 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  ualTab: {.      
4310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4320: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4330: 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  d, nColumn, 0);.
4340: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4350: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  By ){.        pu
4360: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4370: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
4380: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
43a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
43b0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
43c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
43d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
43e0: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
43f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4400: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
4410: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29  nsert, iParm, 0)
4420: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
4440: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4450: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
4460: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
4470: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
4480: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
4490: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
44a0: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
44b0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
44c0: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
44d0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
44e0: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
44f0: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
4500: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
4510: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
4520: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
4530: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
4540: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
4550: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4560: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 32 3b        int addr2;
4570: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
4580: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
4590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
45a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
45b0: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31 2b 33 29  ll, -1, addr1+3)
45c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
45d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
45e0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
45f0: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
4600: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4610: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Goto, 0, 0);.   
4620: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
4640: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
4650: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
4660: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
4670: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
4680: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
4690: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
46a0: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
46b0: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
46c0: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
46d0: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
46e0: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
46f0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
4700: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
4710: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
4720: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
4730: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4740: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
4750: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
4760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4770: 20 20 20 63 68 61 72 20 61 66 66 20 3d 20 28 69     char aff = (i
4780: 50 61 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a  Parm>>16)&0xFF;.
4790: 20 20 20 20 20 20 20 20 61 66 66 20 3d 20 73 71          aff = sq
47a0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
47b0: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
47c0: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
47d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
47e0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
47f0: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61  Record, 1, 0, &a
4800: 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ff, 1);.        
4810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4820: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4830: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
4840: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
4850: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
4860: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
4870: 64 64 72 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ddr2);.      bre
4880: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
4890: 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
48a0: 73 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  sts in the resul
48b0: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
48c0: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
48d0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
48e0: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
48f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4900: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4910: 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72 6d 29 3b  mInt, 1, iParm);
4920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4930: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4940: 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  p, nColumn, 0);.
4950: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
4960: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
4970: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
4980: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
4990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
49a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
49b0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
49c0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
49d0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
49e0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
49f0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
4a00: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
4a10: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
4a20: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
4a30: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
4a40: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
4a50: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
4a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4a70: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4a80: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4a90: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
4aa0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
4ab0: 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20   pOrderBy, p);. 
4ac0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4ae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
4af0: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
4b00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
4b10: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
4b20: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
4b30: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
4b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4b50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4b60: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
4b70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4b80: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
4b90: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
4ba0: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
4bb0: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
4bc0: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
4bd0: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
4be0: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
4bf0: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
4c00: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
4c10: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
4c20: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
4c30: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
4c40: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4c50: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20  T_Subroutine:.  
4c60: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4c70: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ack: {.      if(
4c80: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4ca0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
4cb0: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
4cc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73   0);.        pus
4cd0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4ce0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4cf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4d00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75 62  ( eDest==SRT_Sub
4d10: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
4d20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d30: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
4d40: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
4d50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d70: 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b  p(v, OP_Callback
4d80: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4d90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4da0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  ak;.    }..#if !
4db0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4dc0: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
4dd0: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
4de0: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
4df0: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
4e00: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
4e10: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
4e20: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
4e30: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
4e40: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
4e50: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
4e60: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
4e70: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
4e80: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
4e90: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
4ea0: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
4eb0: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
4ec0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
4ed0: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
4ee0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
4ef0: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t( eDest==SRT_Di
4f00: 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 73  scard );.      s
4f10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f20: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75  v, OP_Pop, nColu
4f30: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  mn, 0);.      br
4f40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4f50: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
4f60: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
4f70: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
4f80: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
4f90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
4fa0: 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70 4f 72 64  Limit>=0 && pOrd
4fb0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73  erBy==0 ){.    s
4fc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4fd0: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
4fe0: 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  1, p->iLimit);. 
4ff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5000: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
5010: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5020: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 72  iBreak);.  }.  r
5030: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5040: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
5050: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
5060: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
5070: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
5080: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
5090: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
50a0: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
50b0: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
50c0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
50d0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
50e0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
50f0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
5100: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
5110: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
5120: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5130: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
5140: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
5150: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
5160: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
5170: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
5180: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
5190: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
51a0: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
51b0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
51c0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
51d0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
51e0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
51f0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
5200: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
5210: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
5220: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
5230: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5240: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
5250: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
5260: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
5270: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
5280: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
5290: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
52a0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
52b0: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
52c0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
52d0: 72 65 20 74 6f 20 74 68 65 20 50 33 20 66 69 65  re to the P3 fie
52e0: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
52f0: 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59 49  using.** P3_KEYI
5300: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
5310: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
5320: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
5330: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
5340: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
5350: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
5360: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
5370: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
5380: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5390: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
53a0: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
53b0: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
53c0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
53d0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
53e0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
53f0: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
5400: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
5410: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
5420: 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
5430: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
5440: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
5450: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
5460: 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f  er = (u8*)&pInfo
5470: 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a  ->aColl[nExpr];.
5480: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c      pInfo->nFiel
5490: 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70  d = nExpr;.    p
54a0: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
54b0: 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  db);.    for(i=0
54c0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
54d0: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
54e0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
54f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5500: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
5510: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
5520: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
5530: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
5540: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
5550: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
5560: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
5570: 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e   }.      pInfo->
5580: 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
5590: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
55a0: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
55b0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b  Item->sortOrder;
55c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
55d0: 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f  urn pInfo;.}.../
55e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
55f0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
5600: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
5610: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
5620: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
5630: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
5640: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
5650: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
5660: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
5670: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
5680: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
5690: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
56a0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
56b0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
56c0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
56d0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
56e0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
56f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
5700: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
5710: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5720: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
5730: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
5740: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
5750: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5760: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
5770: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
5780: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
5790: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
57a0: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   nColumn,     /*
57b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
57c0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
57d0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
57e0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
57f0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
5800: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  e */.  int iParm
5810: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
5820: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73  nal parameter as
5830: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44  sociated with eD
5840: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
5850: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
5860: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
5870: 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c 69   int cont = sqli
5880: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
5890: 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  (v);.  int addr;
58a0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45  .  int iTab;.  E
58b0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
58c0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
58d0: 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65  ..  iTab = pOrde
58e0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  rBy->iECursor;. 
58f0: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
5900: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5910: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62  OP_Sort, iTab, b
5920: 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  rk);.  codeOffse
5930: 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c 20 30 29  t(v, p, cont, 0)
5940: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5950: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
5960: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
5970: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20  y->nExpr + 1);. 
5980: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
5990: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
59a0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
59b0: 52 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20 7b  RT_VirtualTab: {
59c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
59d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
59e0: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 30  wRowid, iParm, 0
59f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5a00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5a10: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
5a20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5a30: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  dOp(v, OP_Insert
5a40: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
5a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5a60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5a70: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5a80: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
5a90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
5aa0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
5ab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5ac0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
5ad0: 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 56 64  l, -1, sqlite3Vd
5ae0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5af0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
5b00: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5b10: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
5b20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5b30: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
5b40: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
5b50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
5b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5b70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
5b80: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 22  eRecord, 1, 0, "
5b90: 63 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  c", P3_STATIC);.
5ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5bb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
5bc0: 49 6e 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30  Insert, (iParm&0
5bd0: 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a  x0000FFFF), 0);.
5be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5bf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
5c00: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
5c10: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
5c20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5c30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5c40: 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c  MemStore, iParm,
5c50: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
5c60: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5c70: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
5c80: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5c90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5ca0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
5cb0: 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b  ase SRT_Callback
5cc0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  :.    case SRT_S
5cd0: 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  ubroutine: {.   
5ce0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
5d10: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
5d20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5d30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5d40: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
5d50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5d60: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
5d70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5d80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
5d90: 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b  olumn, -1-i, i);
5da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5db0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
5dc0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
5dd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5de0: 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63  Op(v, OP_Callbac
5df0: 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  k, nColumn, 0);.
5e00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
5e30: 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20  b, 0, iParm);.  
5e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5e60: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
5e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e80: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
5e90: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
5ea0: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
5eb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
5ec0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
5ed0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
5ee0: 20 77 68 65 6e 20 74 68 65 20 4c 49 4d 49 54 20   when the LIMIT 
5ef0: 69 73 20 72 65 61 63 68 65 64 0a 20 20 2a 2f 0a  is reached.  */.
5f00: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
5f10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5f20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5f30: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d  _MemIncr, -1, p-
5f40: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >iLimit);.    sq
5f50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5f60: 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20  , OP_IfMemZero, 
5f70: 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72 6b 29 3b  p->iLimit, brk);
5f80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
5f90: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
5fa0: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
5fb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
5fc0: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
5fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5fe0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
5ff0: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
6000: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6010: 28 76 2c 20 62 72 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  (v, brk);.}../*.
6020: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
6030: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
6040: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
6050: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6060: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
6070: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
6080: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
6090: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
60a0: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
60b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65  .**.** If the de
60c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
60d0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
60e0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
60f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a  extracted from.*
6100: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43  * the original C
6110: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6120: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
6130: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
6140: 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  umn..** .** The 
6150: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6160: 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69   for an expressi
6170: 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58  on is either TEX
6180: 54 2c 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e  T, NUMERIC or AN
6190: 59 2e 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  Y..** The declar
61a0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
61b0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
61c0: 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74  INTEGER..*/.stat
61d0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
61e0: 6f 6c 75 6d 6e 54 79 70 65 28 4e 61 6d 65 43 6f  olumnType(NameCo
61f0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
6200: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
6210: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20   const *zType;. 
6220: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45   int j;.  if( pE
6230: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70  xpr==0 || pNC->p
6240: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
6250: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  urn 0;..  /* The
6260: 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20   TK_AS operator 
6270: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
6280: 6e 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55  n ORDER BY, GROU
6290: 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20  P BY, HAVING,.  
62a0: 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  ** and LIMIT cla
62b0: 75 73 65 73 2e 20 20 42 75 74 20 70 45 78 70 72  uses.  But pExpr
62c0: 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
62d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
62e0: 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20   a.  ** SELECT. 
62f0: 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65   So pExpr can ne
6300: 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41  ver contain an A
6310: 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  S operator..  */
6320: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
6330: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a  ->op!=TK_AS );..
6340: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
6350: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
6360: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
6370: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
6380: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   0;.      int iC
6390: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
63a0: 75 6d 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  umn;.      while
63b0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
63c0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
63d0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
63e0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
63f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
6400: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
6410: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6420: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
6430: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
6440: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
6450: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
6460: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
6470: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
6480: 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  b;.        }else
6490: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
64a0: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
64b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
64c0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
64d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
64e0: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
64f0: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
6500: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
6510: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
6520: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
6530: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
6540: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
6550: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
6560: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
6570: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
6580: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
6590: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
65a0: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
65b0: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
65c0: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
65d0: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
65e0: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
65f0: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
6600: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
6610: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
6620: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
6630: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
6640: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
6650: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
6660: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
6670: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
6680: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
6690: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
66a0: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
66b0: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
66c0: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
66d0: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
66e0: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
66f0: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
6700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6710: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
6720: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
6730: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
6740: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
6750: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
6760: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
6770: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
6780: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
6790: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
67a0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
67b0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65  TEGER";.      }e
67c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  lse{.        zTy
67d0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
67e0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
67f0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6800: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6820: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
6830: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
6840: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
6850: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
6860: 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  pS = pExpr->pSel
6870: 65 63 74 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ect;.      sNC.p
6880: 53 72 63 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  SrcList = pExpr-
6890: 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
68a0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
68b0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 7a 54 79  = pNC;.      zTy
68c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
68d0: 26 73 4e 43 2c 20 70 53 2d 3e 70 45 4c 69 73 74  &sNC, pS->pEList
68e0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a  ->a[0].pExpr); .
68f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6900: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
6910: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79  fault:.      zTy
6920: 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20  pe = 0;.  }.  . 
6930: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
6940: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6950: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6960: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
6970: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
6980: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
6990: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
69a0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
69b0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
69c0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
69d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
69e0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
69f0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
6a00: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
6a10: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
6a20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6a30: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
6a40: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
6a50: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
6a60: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6a70: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
6a80: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
6a90: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
6aa0: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
6ab0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
6ac0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
6ad0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
6ae0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
6af0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
6b00: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
6b10: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
6b20: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79   p);.    if( zTy
6b30: 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
6b40: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ;.    /* The vdb
6b50: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73  e must make it's
6b60: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
6b70: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e   column-type, in
6b80: 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
6b90: 2a 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  * schema is rese
6ba0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 76 69  t before this vi
6bb0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
6bc0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
6bd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6be0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b  SetColName(v, i+
6bf0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a  pEList->nExpr, z
6c00: 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79  Type, strlen(zTy
6c10: 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pe));.  }.}../*.
6c20: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
6c30: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
6c40: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
6c50: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
6c60: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
6c70: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
6c80: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
6c90: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
6ca0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
6cb0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
6cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
6cd0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
6ce0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
6cf0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
6d00: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
6d10: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6d20: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
6d30: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
6d40: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
6d50: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
6d60: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
6d70: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
6d80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
6d90: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
6da0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
6db0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6dc0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
6dd0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
6de0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6df0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
6e00: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
6e10: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
6e20: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
6e30: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
6e40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6e50: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
6e60: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
6e70: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
6e80: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
6e90: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
6ea0: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
6eb0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
6ec0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
6ed0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
6ee0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
6ef0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
6f00: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
6f10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6f20: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
6f30: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
6f40: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
6f50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
6f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
6f70: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
6f80: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
6f90: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
6fa0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
6fb0: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
6fc0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
6fd0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
6fe0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
6ff0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
7000: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
7010: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
7020: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
7030: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
7040: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
7050: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
7060: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
7070: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
7080: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
7090: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
70a0: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
70b0: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
70c0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
70d0: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
70e0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
70f0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
7100: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
7110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
7120: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
7130: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
7140: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
7150: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
7160: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
7170: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
7180: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
7190: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
71a0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
71b0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
71c0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
71d0: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
71e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
71f0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
7200: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
7210: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
7220: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
7230: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
7240: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26   && p->span.z &&
7250: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
7260: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7270: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
7280: 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  , i, (char*)p->s
7290: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
72a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
72b0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
72c0: 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20  (!shortNames && 
72d0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
72e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
72f0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
7300: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7310: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
7320: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7330: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
7340: 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20    if( fullNames 
7350: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
7360: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
7370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7380: 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
7390: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
73a0: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
73b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
73c0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
73d0: 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41  , zName, P3_DYNA
73e0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
73f0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7400: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7410: 28 76 2c 20 69 2c 20 7a 43 6f 6c 2c 20 73 74 72  (v, i, zCol, str
7420: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
7430: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
7440: 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  ( p->span.z && p
7450: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
7460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7470: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7480: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
7490: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
74a0: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
74b0: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
74c0: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
74d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
74e0: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
74f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
7500: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
7510: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
7520: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e        sprintf(zN
7530: 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  ame, "column%d",
7540: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
7550: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7560: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
7570: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
7580: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
7590: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
75a0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
75b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
75c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
75d0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
75e0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
75f0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
7600: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
7610: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
7620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
7630: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
7640: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
7650: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
7660: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
7670: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
7680: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
7690: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
76a0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
76b0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
76c0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
76d0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
76e0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
76f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
7700: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
7710: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
7720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
7730: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7740: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
7750: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
7760: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
7770: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
7780: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
7790: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
77a0: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
77b0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
77c0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
77d0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
77e0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
77f0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
7800: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
7810: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
7820: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
7830: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
7840: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
7850: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
7860: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
7870: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
7880: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
7890: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
78a0: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20  aCol, *pCol;..  
78b0: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
78c0: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
78d0: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
78e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
78f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
7900: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  lve(pParse, pSel
7910: 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  ect, 0) ){.    r
7920: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7930: 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Tab = sqliteMall
7940: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
7950: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
7960: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7970: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
7980: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7990: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
79a0: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
79b0: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
79c0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
79d0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
79e0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
79f0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
7a00: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
7a10: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
7a20: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
7a30: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7a40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
7a50: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
7a60: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
7a70: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
7a80: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
7a90: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
7aa0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
7ab0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
7ac0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61  e;.    char *zBa
7ad0: 73 65 6e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c  sename;.    Coll
7ae0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
7af0: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d  int cnt;.    Nam
7b00: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
7b10: 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e    .    /* Get an
7b20: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
7b30: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
7b40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
7b50: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
7b60: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
7b70: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
7b80: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
7b90: 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  .z==0 || p->pRig
7ba0: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  ht->token.z[0]!=
7bb0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
7bc0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
7bd0: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
7be0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
7bf0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
7c00: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
7c10: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
7c20: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
7c30: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
7c40: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d  qliteStrDup(zNam
7c50: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
7c60: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
7c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
7c80: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
7c90: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
7ca0: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
7cb0: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
7cc0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   For columns of 
7cd0: 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65  the from A.B use
7ce0: 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a   B as the name *
7cf0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
7d00: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
7d10: 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29  %T", &pR->token)
7d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7d30: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
7d40: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
7d50: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
7d60: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
7d70: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
7d80: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
7d90: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
7da0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7db0: 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29  ("%T", &p->span)
7dc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7dd0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
7de0: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
7df0: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
7e00: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7e10: 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25  MPrintf("column%
7e20: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  d", i+1);.    }.
7e30: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
7e40: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  te(zName);.    i
7e50: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
7e60: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
7e70: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
7e80: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
7e90: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
7ea0: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65   pTab);.      re
7eb0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
7ec0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
7ed0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
7ee0: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
7ef0: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
7f00: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
7f10: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
7f20: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
7f30: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
7f40: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
7f50: 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61   zBasename = zNa
7f60: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  me;.    for(j=cn
7f70: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
7f80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7f90: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
7fa0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
7fb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61  0 ){.        zNa
7fc0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
7fd0: 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61  ntf("%s:%d", zBa
7fe0: 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a  sename, ++cnt);.
7ff0: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
8000: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
8010: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e==0 ) break;.  
8020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8030: 69 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a  if( zBasename!=z
8040: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
8050: 6c 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61  liteFree(zBasena
8060: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
8070: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
8080: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
8090: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
80a0: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
80b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
80c0: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
80d0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
80e0: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
80f0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
8100: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
8110: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
8120: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
8130: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63  = sqliteStrDup(c
8140: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
8150: 70 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  p));.    pCol->z
8160: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
8170: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8180: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
8190: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
81a0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
81b0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
81c0: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
81d0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
81e0: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
81f0: 65 53 74 72 44 75 70 28 70 43 6f 6c 6c 2d 3e 7a  eStrDup(pColl->z
8200: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
8210: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
8220: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 54   -1;.  return pT
8230: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ab;.}../*.** Pre
8240: 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73 74  pare a SELECT st
8250: 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
8260: 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67 20  essing by doing 
8270: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
8280: 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20   things:.**.**  
8290: 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
82a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
82b0: 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
82c0: 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
82d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
82e0: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
82f0: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
8300: 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
8310: 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
8320: 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
8330: 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
8340: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
8350: 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
8360: 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
8370: 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
8380: 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
8390: 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
83a0: 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
83b0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
83c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
83d0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
83e0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
83f0: 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
8400: 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
8410: 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
8420: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
8430: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
8440: 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
8450: 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
8460: 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
8470: 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
8480: 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
8490: 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
84a0: 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
84b0: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
84c0: 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
84d0: 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
84e0: 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
84f0: 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
8500: 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
8510: 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
8520: 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
8530: 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
8540: 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
8550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
8560: 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
8570: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
8580: 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
8590: 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
85a0: 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
85b0: 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
85c0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
85d0: 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
85e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
85f0: 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
8600: 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
8610: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
8620: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
8630: 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
8640: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
8650: 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
8660: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  ** Return 0 on s
8670: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 72  uccess.  If ther
8680: 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20  e are problems, 
8690: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
86a0: 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
86b0: 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rse and return n
86c0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
86d0: 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63  ic int prepSelec
86e0: 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50 61  tStmt(Parse *pPa
86f0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
8700: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
8710: 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  rc;.  SrcList *p
8720: 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
8730: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54  ist *pEList;.  T
8740: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 74  able *pTab;.  st
8750: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
8760: 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28  m *pFrom;..  if(
8770: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63   p==0 || p->pSrc
8780: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61  ==0 || sqlite3Ma
8790: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
87a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
87b0: 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
87c0: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
87d0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
87e0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
87f0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
8800: 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
8810: 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
8820: 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
8830: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
8840: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
8850: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
8860: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
8870: 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  rs(pParse, p->pS
8880: 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  rc);..  /* Look 
8890: 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
88a0: 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
88b0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
88c0: 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
88d0: 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
88e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
88f0: 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
8900: 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
8910: 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
8920: 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
8930: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
8940: 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
8950: 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
8960: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
8970: 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
8980: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
8990: 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
89a0: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
89b0: 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
89c0: 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
89d0: 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
89e0: 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
89f0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
8a00: 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
8a10: 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
8a20: 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
8a30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
8a40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8a50: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
8a60: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8a70: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
8a80: 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
8a90: 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
8aa0: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
8ab0: 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
8ac0: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
8ad0: 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ct!=0 );.      i
8ae0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  f( pFrom->zAlias
8af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
8b00: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20  From->zAlias =. 
8b10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8b20: 4d 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f  MPrintf("sqlite_
8b30: 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28  subquery_%p_", (
8b40: 76 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65  void*)pFrom->pSe
8b50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lect);.      }. 
8b60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
8b70: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
8b80: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
8b90: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
8ba0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74     sqlite3Result
8bb0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
8bc0: 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  se, pFrom->zAlia
8bd0: 73 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  s, pFrom->pSelec
8be0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  t);.      if( pT
8bf0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
8c00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
8c10: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   }.      /* The 
8c20: 69 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67  isTransient flag
8c30: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
8c40: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
8c50: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
8c60: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
8c70: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
8c80: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
8c90: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
8ca0: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
8cb0: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
8cc0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
8cd0: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
8ce0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
8cf0: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
8d00: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
8d10: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
8d20: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20  ->isTransient = 
8d30: 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  1;.#endif.    }e
8d40: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
8d50: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
8d60: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
8d70: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
8d80: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
8d90: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
8da0: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
8db0: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
8dc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
8dd0: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
8de0: 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
8df0: 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
8e00: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
8e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
8e20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
8e30: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
8e40: 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
8e50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
8e60: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
8e70: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
8e80: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
8e90: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
8ea0: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
8eb0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
8ec0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
8ed0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8ee0: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
8ef0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8f00: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
8f10: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72         /* If pFr
8f20: 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69  om->pSelect!=0 i
8f30: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
8f40: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
8f50: 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
8f60: 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
8f70: 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
8f80: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
8f90: 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
8fa0: 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
8fb0: 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
8fc0: 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
8fd0: 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
8fe0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
8ff0: 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
9000: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
9010: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
9020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
9030: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
9040: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
9050: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
9060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9070: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
9080: 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
9090: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
90a0: 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
90b0: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
90c0: 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
90d0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
90e0: 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20  in(pParse, p) ) 
90f0: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
9100: 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
9110: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
9120: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
9130: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
9140: 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
9150: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
9160: 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
9170: 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
9180: 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
9190: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
91a0: 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
91b0: 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
91c0: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
91d0: 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
91e0: 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
91f0: 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
9200: 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
9210: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
9220: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
9230: 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
9240: 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
9250: 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
9260: 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
9270: 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
9280: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
9290: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
92a0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
92b0: 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
92c0: 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
92d0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
92e0: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
92f0: 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
9300: 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
9310: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
9320: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
9330: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9340: 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
9350: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
9360: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
9370: 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
9380: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
9390: 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
93a0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
93b0: 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
93c0: 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
93d0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
93e0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
93f0: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70  c = 0;.  if( k<p
9400: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
9410: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
9420: 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
9430: 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
9440: 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
9450: 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
9460: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
9470: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
9480: 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
9490: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
94a0: 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
94b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
94c0: 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
94d0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
94e0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
94f0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
9500: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
9510: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
9520: 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
9530: 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
9540: 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
9550: 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
9560: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
9570: 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20  olNames)!=0 &&. 
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51       (flags & SQ
95a0: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
95b0: 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
95c0: 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
95d0: 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
95e0: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b     Expr *pE = a[
95f0: 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
9600: 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
9610: 4c 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  LL &&.          
9620: 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
9630: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d   || pE->pRight==
9640: 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d  0 || pE->pRight-
9650: 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a  >op!=TK_ALL) ){.
9660: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
9670: 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
9680: 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
9690: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
96a0: 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
96b0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
96c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
96d0: 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  end(pNew, a[k].p
96e0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
96f0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
9700: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
9710: 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
9720: 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
9730: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
9740: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
9750: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
9760: 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
9770: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
9780: 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
9790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
97a0: 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
97b0: 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
97c0: 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
97d0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
97e0: 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
97f0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
9800: 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
9810: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
9820: 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
9830: 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
9840: 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
9850: 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
9860: 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
9870: 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
9880: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
9890: 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
98a0: 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
98b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
98c0: 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65  omToken(&pE->pLe
98d0: 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ft->token);.    
98e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
98f0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b       zTName = 0;
9900: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9910: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
9920: 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
9930: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
9940: 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
9950: 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
9960: 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
9970: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Tab;.          c
9980: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
9990: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
99a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
99b0: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62  bName==0 || zTab
99c0: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20  Name[0]==0 ){ . 
99d0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e             zTabN
99e0: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
99f0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
9a00: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
9a10: 61 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65  ame && (zTabName
9a20: 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b  ==0 || zTabName[
9a30: 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20  0]==0 || .      
9a40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
9a50: 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
9a60: 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20  , zTabName)!=0) 
9a70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
9a80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
9a90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
9aa0: 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ableSeen = 1;.  
9ab0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9ac0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
9ad0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9ae0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70   Expr *pExpr, *p
9af0: 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Left, *pRight;. 
9b00: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
9b10: 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
9b20: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20  Col[j].zName;.. 
9b30: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
9b40: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
9b50: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
9b60: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d  st_item *pLeft =
9b70: 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d   &pTabList->a[i-
9b80: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
9b90: 20 20 69 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f    if( (pLeft->jo
9ba0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
9bb0: 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
9be0: 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
9bf0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
9c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
9c10: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
9c20: 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
9c30: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
9c50: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
9c60: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
9c70: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9c90: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
9ca0: 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
9cb0: 74 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 55  tIndex(pLeft->pU
9cc0: 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
9cd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9ce0: 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
9cf0: 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
9d00: 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
9d10: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
9d20: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
9d30: 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
9d40: 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
9d50: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
9d60: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9d70: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
9d80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
9d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
9da0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
9db0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
9dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
9dd0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62  f( pRight==0 ) b
9de0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9df0: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52 69 67    setToken(&pRig
9e00: 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65  ht->token, zName
9e10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
9e20: 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 28  f( zTabName && (
9e30: 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
9e40: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
9e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9e60: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
9e70: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
9e80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
9e90: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
9ea0: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
9eb0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
9ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9ed0: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
9ee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
9ef0: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c      setToken(&pL
9f00: 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62  eft->token, zTab
9f10: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
9f20: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
9f30: 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69  Expr->span, sqli
9f40: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25  te3MPrintf("%s.%
9f50: 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
9f60: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
9f70: 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e       pExpr->span
9f80: 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  .dyn = 1;.      
9f90: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
9fa0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  oken.z = 0;.    
9fb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
9fc0: 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20  >token.n = 0;.  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
9fe0: 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30  r->token.dyn = 0
9ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
a000: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a010: 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
a020: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
a030: 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70   pExpr->span = p
a040: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Expr->token;.   
a050: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a060: 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
a070: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
a080: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
a090: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a0a0: 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  nd(pNew, pExpr, 
a0b0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
a0c0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
a0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a0e0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
a0f0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
a100: 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68  w, pExpr, &pRigh
a110: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
a120: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a130: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a140: 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
a150: 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
a160: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
a170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a180: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a190: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
a1a0: 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
a1b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
a1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a1d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a1e0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
a1f0: 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
a200: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a210: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
a220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a230: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d  sqliteFree(zTNam
a240: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a250: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
a260: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69  rListDelete(pELi
a270: 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
a280: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
a290: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
a2a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a2b0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a2c0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
a2d0: 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65 73  utine associates
a2e0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20 4f   entries in an O
a2f0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
a300: 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  on list with.** 
a310: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65 73  columns in a res
a320: 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20 4f  ult.  For each O
a330: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
a340: 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20 6f  on, the opcode o
a350: 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76  f.** the top-lev
a360: 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e 67  el node is chang
a370: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ed to TK_COLUMN 
a380: 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20  and the iColumn 
a390: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
a3a0: 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69  top-level node i
a3b0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
a3c0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61   column number a
a3d0: 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a  nd the iTable.**
a3e0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 6f   value of the to
a3f0: 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20  p-level node is 
a400: 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61 62  filled with iTab
a410: 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  le parameter..**
a420: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
a430: 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63 6c   prior SELECT cl
a440: 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65 20  auses, they are 
a450: 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74 2e  processed first.
a460: 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20    A match.** in 
a470: 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45 43  an earlier SELEC
a480: 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65 6e  T takes preceden
a490: 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72 20  ce over a later 
a4a0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e  SELECT..**.** An
a4b0: 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f 65  y entry that doe
a4c0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20 66  s not match is f
a4d0: 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72 72  lagged as an err
a4e0: 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  or.  The number.
a4f0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73 20  ** of errors is 
a500: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
a510: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72 64  tic int matchOrd
a520: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20  erbyToColumn(.  
a530: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a540: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c 61          /* A pla
a550: 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72 6f  ce to leave erro
a560: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
a570: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
a580: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
a590: 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   to result colum
a5a0: 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  ns of this SELEC
a5b0: 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  T */.  ExprList 
a5c0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
a5d0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 76  * The ORDER BY v
a5e0: 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20 61  alues to match a
a5f0: 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a  gainst columns *
a600: 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
a610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a620: 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75 65  nsert this value
a630: 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20   in iTable */.  
a640: 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65  int mustComplete
a650: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54 52          /* If TR
a660: 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 73  UE all ORDER BYs
a670: 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29   must match */.)
a680: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
a690: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
a6a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
a6b0: 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  ;..  if( pSelect
a6c0: 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d  ==0 || pOrderBy=
a6d0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
a6e0: 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74   if( mustComplet
a6f0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
a700: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
a710: 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65  xpr; i++){ pOrde
a720: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
a730: 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20   0; }.  }.  if( 
a740: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70  prepSelectStmt(p
a750: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20  Parse, pSelect) 
a760: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
a770: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c 65  .  }.  if( pSele
a780: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
a790: 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65 72    if( matchOrder
a7a0: 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73  byToColumn(pPars
a7b0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e, pSelect->pPri
a7c0: 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69 54  or, pOrderBy, iT
a7d0: 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  able, 0) ){.    
a7e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a7f0: 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
a800: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
a810: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a820: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
a830: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
a840: 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pE = pOrderBy->a
a850: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
a860: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
a870: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
a880: 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74  a[i].done ) cont
a890: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
a8a0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
a8b0: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
a8c0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
a8d0: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
a8e0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
a8f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a900: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
a910: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
a920: 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f 75  position %d shou
a930: 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ld be between 1 
a940: 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20  and %d",.       
a950: 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d     iCol, pEList-
a960: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
a970: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
a980: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a990: 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74 43        if( !mustC
a9a0: 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e  omplete ) contin
a9b0: 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d  ue;.      iCol--
a9c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
a9d0: 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a  j=0; iCol<0 && j
a9e0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
a9f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
aa00: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
aa10: 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54  me && (pE->op==T
aa20: 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d  K_ID || pE->op==
aa30: 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20 20  TK_STRING) ){.  
aa40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
aa50: 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20  e, *zLabel;.    
aa60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69      zName = pELi
aa70: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
aa80: 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d          zLabel =
aa90: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
aaa0: 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e  Token(&pE->token
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
aac0: 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a  t( zLabel!=0 );.
aad0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
aae0: 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
aaf0: 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20  , zLabel)==0 ){ 
ab00: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
ab10: 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
ab20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
ab30: 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  e(zLabel);.     
ab40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
ab50: 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  l<0 && sqlite3Ex
ab60: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 45  prCompare(pE, pE
ab70: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
ab80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  ) ){.        iCo
ab90: 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  l = j;.      }. 
aba0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
abb0: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  l>=0 ){.      pE
abc0: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
abd0: 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c  ;.      pE->iCol
abe0: 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
abf0: 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pE->iTable = i
ac00: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d  Table;.      pE-
ac10: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
ac20: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
ac30: 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  .done = 1;.    }
ac40: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
ac50: 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  && mustComplete 
ac60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ac70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
ac80: 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  .        "ORDER 
ac90: 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20 25  BY term number %
aca0: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
acb0: 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
acc0: 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  mn", i+1);.     
acd0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62   nErr++;.      b
ace0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
acf0: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
ad00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66  .}.#endif /* #if
ad10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ad20: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
ad30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   */../*.** Get a
ad40: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
ad50: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
ad60: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
ad70: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
ad80: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
ad90: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
ada0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
adb0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
adc0: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
add0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
ade0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
adf0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ae00: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
ae10: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
ae20: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
ae30: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
ae40: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
ae50: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
ae60: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
ae70: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
ae80: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
ae90: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
aea0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
aeb0: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
aec0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
aed0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
aee0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
aef0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
af00: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
af10: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
af20: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
af30: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
af40: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
af50: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
af60: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
af70: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
af80: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
af90: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
afa0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
afb0: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
afc0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
afd0: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
afe0: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
aff0: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
b000: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
b010: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
b020: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
b030: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
b040: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
b050: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
b060: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
b070: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
b080: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
b090: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
b0a0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
b0b0: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
b0c0: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
b0d0: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
b0e0: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
b0f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a  default values.*
b100: 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e  * (usually but n
b110: 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72  ot always -1) pr
b120: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
b130: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
b140: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
b150: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
b160: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
b170: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
b180: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
b190: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
b1a0: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
b1b0: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
b1c0: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
b1d0: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
b1e0: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
b1f0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
b200: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
b210: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
b220: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
b230: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
b240: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
b250: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
b260: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
b270: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
b280: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
b290: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
b2a0: 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20  addr2;..  /* .  
b2b0: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
b2c0: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
b2d0: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
b2e0: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
b2f0: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
b300: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
b310: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
b320: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
b330: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
b340: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
b350: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
b360: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
b370: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
b380: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
b390: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 72   = iLimit = pPar
b3a0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50  se->nMem;.    pP
b3b0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
b3c0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b3d0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b3e0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b3f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
b400: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b410: 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  se, p->pLimit);.
b420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b430: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
b440: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
b450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b460: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
b470: 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  , iLimit, 0);.  
b480: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b490: 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74  , "# LIMIT count
b4a0: 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  er"));.    sqlit
b4b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b4c0: 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69  P_IfMemZero, iLi
b4d0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
b4e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
b4f0: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
b500: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
b510: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
b520: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
b530: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
b540: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
b550: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
b560: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b570: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  se, p->pOffset);
b580: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b590: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
b5a0: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
b5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5c0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
b5d0: 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70  e, iOffset, p->p
b5e0: 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56  Limit==0);.    V
b5f0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
b600: 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72  # OFFSET counter
b610: 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d  "));.    addr1 =
b620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b630: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
b640: 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20  , iOffset, 0);. 
b650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b660: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
b670: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b680: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b690: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
b6a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b6b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b6c0: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  1);.    if( p->p
b6d0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73  Limit ){.      s
b6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b6f0: 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29  v, OP_Add, 0, 0)
b700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
b710: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
b720: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
b730: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b740: 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d  P_IfMemPos, iLim
b750: 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
b760: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b770: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
b780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b790: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
b7a0: 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29 3b  , -1, iLimit+1);
b7b0: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
b7c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b7d0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
b7e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b7f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b800: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
b810: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b820: 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2b  emStore, iLimit+
b830: 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43  1, 1);.    VdbeC
b840: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49  omment((v, "# LI
b850: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
b860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b870: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
b880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
b890: 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75 61  llocate a virtua
b8a0: 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
b8b0: 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73  or sorting..*/.s
b8c0: 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61 74  tatic void creat
b8d0: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61  eSortingIndex(Pa
b8e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
b8f0: 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74  ect *p, ExprList
b900: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 69   *pOrderBy){.  i
b910: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
b920: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
b930: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
b940: 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20 29  y->iECursor==0 )
b950: 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
b960: 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
b970: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61  e->nTab++;.    a
b980: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
b990: 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e 70  eAddOp(pParse->p
b9a0: 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Vdbe, OP_OpenVir
b9b0: 74 75 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tual,.          
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
b9e0: 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
b9f0: 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 61 73  nExpr+1);.    as
ba00: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
ba10: 6e 56 69 72 74 5b 32 5d 20 3d 3d 20 2d 31 20 29  nVirt[2] == -1 )
ba20: 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
ba30: 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64 64 72 3b  nVirt[2] = addr;
ba40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
ba50: 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72  e opcode at addr
ba60: 20 69 73 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69   is an OP_OpenVi
ba70: 72 74 75 61 6c 20 74 68 61 74 20 63 72 65 61 74  rtual that creat
ba80: 65 64 20 61 20 73 6f 72 74 69 6e 67 0a 2a 2a 20  ed a sorting.** 
ba90: 69 6e 64 65 78 20 74 68 61 20 77 65 20 65 6e 64  index tha we end
baa0: 65 64 20 75 70 20 6e 6f 74 20 6e 65 65 64 69 6e  ed up not needin
bab0: 67 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  g.  This routine
bac0: 20 63 68 61 6e 67 65 73 20 74 68 61 74 0a 2a 2a   changes that.**
bad0: 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 5f 4e 6f   opcode to OP_No
bae0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
baf0: 69 64 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69  id uncreateSorti
bb00: 6e 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  ngIndex(Parse *p
bb10: 50 61 72 73 65 2c 20 69 6e 74 20 61 64 64 72 29  Parse, int addr)
bb20: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
bb30: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56  arse->pVdbe;.  V
bb40: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c  dbeOp *pOp = sql
bb50: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
bb60: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
bb70: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
bb80: 20 61 64 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20   addr, 0, 0);.  
bb90: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
bba0: 5f 4e 6f 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31  _Noop;.  pOp->p1
bbb0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 32 20   = 0;.  pOp->p2 
bbc0: 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  = 0;.}..#ifndef 
bbd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
bbe0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a  OUND_SELECT./*.*
bbf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70  * Return the app
bc00: 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69  ropriate collati
bc10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
bc20: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
bc30: 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73  mn of.** the res
bc40: 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20  ult set for the 
bc50: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
bc60: 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20  statement "p".  
bc70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a  Return NULL if.*
bc80: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  * the column has
bc90: 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c   no default coll
bca0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
bcb0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
bcc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
bcd0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
bce0: 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72  lect is taken fr
bcf0: 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d  om the.** left-m
bd00: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
bd10: 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20  select that has 
bd20: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
bd30: 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
bd40: 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65  CollSeq *multiSe
bd50: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73  lectCollSeq(Pars
bd60: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
bd70: 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  t *p, int iCol){
bd80: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74  .  CollSeq *pRet
bd90: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
bda0: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
bdb0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
bdc0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50  eq(pParse, p->pP
bdd0: 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d  rior, iCol);.  }
bde0: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d  else{.    pRet =
bdf0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52   0;.  }.  if( pR
be00: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65  et==0 ){.    pRe
be10: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
be20: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
be30: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
be40: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
be50: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
be60: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
be70: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
be80: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
be90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
bea0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
beb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bec0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
bed0: 63 65 73 73 20 61 20 71 75 65 72 79 20 74 68 61  cess a query tha
bee0: 74 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  t is really the 
bef0: 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65  union.** or inte
bf00: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  rsection of two 
bf10: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
bf20: 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20   queries..**.** 
bf30: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
bf40: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
bf50: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
bf60: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
bf70: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
bf80: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
bf90: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
bfa0: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
bfb0: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
bfc0: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
bfd0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
bfe0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
bff0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
c000: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
c010: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
c020: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
c030: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
c040: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
c050: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
c060: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
c070: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
c080: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
c090: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
c0a0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
c0b0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
c0c0: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
c0d0: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
c0e0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
c0f0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
c100: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
c110: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
c120: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
c130: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
c140: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
c150: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
c160: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c170: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
c180: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
c190: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
c1a0: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
c1b0: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
c1c0: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
c1d0: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
c1e0: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
c1f0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
c200: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
c210: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
c220: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
c230: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
c240: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
c250: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
c260: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
c270: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
c280: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
c290: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
c2a0: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
c2b0: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
c2c0: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
c2d0: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
c2e0: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
c2f0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
c300: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
c310: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c320: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
c330: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c340: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
c350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
c360: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
c370: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
c380: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
c390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f             /* \_
c3a0: 5f 5f 20 20 53 74 6f 72 65 20 71 75 65 72 79 20  __  Store query 
c3b0: 72 65 73 75 6c 74 73 20 61 73 20 73 70 65 63 69  results as speci
c3c0: 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  fied */.  int iP
c3d0: 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  arm,            
c3e0: 2f 2a 20 2f 20 20 20 20 20 62 79 20 74 68 65 73  /* /     by thes
c3f0: 65 20 74 77 6f 20 70 61 72 61 6d 65 74 65 72 73  e two parameters
c400: 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 63  .         */.  c
c410: 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20  har *aff        
c420: 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
c430: 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
c440: 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
c450: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ng */.){.  int r
c460: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c470: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
c480: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
c490: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
c4a0: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
c4b0: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
c4c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
c4d0: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
c4e0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
c4f0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
c500: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
c510: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c530: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
c540: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c550: 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  et */.  ExprList
c560: 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
c570: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
c580: 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69  ause on p */.  i
c590: 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b 20 20 20  nt aSetP2[2];   
c5a0: 20 20 20 20 20 2f 2a 20 53 65 74 20 50 32 20 76       /* Set P2 v
c5b0: 61 6c 75 65 20 6f 66 20 74 68 65 73 65 20 6f 70  alue of these op
c5c0: 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f   to number of co
c5d0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
c5e0: 53 65 74 50 32 20 3d 20 30 3b 20 20 20 20 20 20  SetP2 = 0;      
c5f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
c600: 6f 74 73 20 69 6e 20 61 53 65 74 50 32 5b 5d 20  ots in aSetP2[] 
c610: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  used */..  /* Ma
c620: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
c630: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
c640: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
c650: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
c660: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
c670: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
c680: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
c690: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
c6a0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
c6b0: 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  IT..  */.  if( p
c6c0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72  ==0 || p->pPrior
c6d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
c6e0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c6f0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c700: 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  }.  pPrior = p->
c710: 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
c720: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
c730: 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a  most!=pPrior );.
c740: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
c750: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d  ->pRightmost==p-
c760: 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20  >pRightmost );. 
c770: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72   if( pPrior->pOr
c780: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  derBy ){.    sql
c790: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
c7a0: 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c  rse,"ORDER BY cl
c7b0: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
c7c0: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
c7d0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
c7e0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
c7f0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
c800: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c810: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
c820: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
c830: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
c840: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c850: 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73  ,"LIMIT clause s
c860: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
c870: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
c880: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
c890: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
c8a0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
c8b0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c8c0: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
c8d0: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
c8e0: 61 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e  a valid query en
c8f0: 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63  gine.  If not, c
c900: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
c910: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
c920: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c930: 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
c940: 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
c950: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c960: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
c970: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65  /* Create the de
c980: 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72  stination tempor
c990: 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63  ary table if nec
c9a0: 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66  essary.  */.  if
c9b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56 69 72  ( eDest==SRT_Vir
c9c0: 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20 20 61  tualTab ){.    a
c9d0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
c9e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c9f0: 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53  nSetP2<sizeof(aS
ca00: 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65  etP2)/sizeof(aSe
ca10: 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61  tP2[0]) );.    a
ca20: 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20  SetP2[nSetP2++] 
ca30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ca40: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
ca50: 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 30 29 3b  tual, iParm, 0);
ca60: 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53 52 54  .    eDest = SRT
ca70: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
ca80: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ca90: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
caa0: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
cab0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
cac0: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
cad0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 77 69 74 63  OrderBy;.  switc
cae0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
caf0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
cb00: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
cb10: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
cb20: 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
cb30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
cb40: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
cb50: 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
cb60: 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  >pLimit = p->pLi
cb70: 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
cb80: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
cb90: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
cba0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
cbb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
cbc0: 72 69 6f 72 2c 20 65 44 65 73 74 2c 20 69 50 61  rior, eDest, iPa
cbd0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  rm, 0, 0, 0, aff
cbe0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c  );.        p->pL
cbf0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
cc00: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
cc10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
cc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
cc30: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
cc40: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
cc50: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
cc60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
cc70: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
cc80: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
cc90: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
cca0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
ccb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69          if( p->i
ccc0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
ccd0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
cce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ccf0: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
cd00: 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->iLimit, 0);.  
cd10: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
cd20: 65 6e 74 28 28 76 2c 20 22 23 20 4a 75 6d 70 20  ent((v, "# Jump 
cd30: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
cd40: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
cd50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
cd60: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
cd70: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
cd80: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
cd90: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
cda0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
cdb0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
cdc0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
cdd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cde0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
cdf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
ce00: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  r ){.          s
ce10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ce20: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
ce30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ce40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ce50: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
ce60: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
ce70: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
ce80: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
ce90: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
cea0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
ceb0: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
cec0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
ced0: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
cee0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
cef0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cf00: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
cf10: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
cf20: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
cf30: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
cf40: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
cf50: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
cf60: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
cf70: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
cf80: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
cf90: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
cfa0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
cfb0: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
cfc0: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
cfd0: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
cfe0: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
cff0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
d000: 72 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f  r;..      priorO
d010: 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  p = p->op==TK_AL
d020: 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65 20 3a 20  L ? SRT_Table : 
d030: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
d040: 20 69 66 28 20 65 44 65 73 74 3d 3d 70 72 69 6f   if( eDest==prio
d050: 72 4f 70 20 26 26 20 70 4f 72 64 65 72 42 79 3d  rOp && pOrderBy=
d060: 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74  =0 && !p->pLimit
d070: 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20   && !p->pOffset 
d080: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
d090: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
d0a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
d0b0: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
d0c0: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
d0d0: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
d0e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
d0f0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
d100: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d110: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
d120: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
d130: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
d140: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
d150: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
d160: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
d170: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
d180: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
d190: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d1a0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
d1b0: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
d1c0: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
d1d0: 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65  pParse, p, pOrde
d1e0: 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 31 29  rBy, unionTab,1)
d1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
d200: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
d210: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d220: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
d230: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
d240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d250: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
d260: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
d270: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72  ;.        if( pr
d280: 69 6f 72 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65  iorOp==SRT_Table
d290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
d2a0: 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a  sert( nSetP2<siz
d2b0: 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65  eof(aSetP2)/size
d2c0: 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b  of(aSetP2[0]) );
d2d0: 0a 20 20 20 20 20 20 20 20 20 20 61 53 65 74 50  .          aSetP
d2e0: 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64  2[nSetP2++] = ad
d2f0: 64 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  dr;.        }els
d300: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
d310: 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
d320: 56 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Virt[0] == -1 );
d330: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64  .          p->ad
d340: 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20  drOpenVirt[0] = 
d350: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20  addr;.          
d360: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75  p->pRightmost->u
d370: 73 65 73 56 69 72 74 20 3d 20 31 3b 0a 20 20 20  sesVirt = 1;.   
d380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
d390: 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
d3a0: 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72  x(pParse, p, pOr
d3b0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
d3c0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d3d0: 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
d3e0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
d3f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d400: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
d410: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
d420: 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
d430: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
d440: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d450: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d460: 72 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f  r, priorOp, unio
d470: 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61  nTab, 0, 0, 0, a
d480: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
d490: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
d4a0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d4b0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
d4c0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
d4d0: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
d4e0: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
d4f0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
d500: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ->op ){.        
d510: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
d520: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
d530: 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  t;   break;.    
d540: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49       case TK_UNI
d550: 4f 4e 3a 20 20 20 6f 70 20 3d 20 53 52 54 5f 55  ON:   op = SRT_U
d560: 6e 69 6f 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a  nion;    break;.
d570: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
d580: 5f 41 4c 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53  _ALL:     op = S
d590: 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 62 72 65  RT_Table;    bre
d5a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d5b0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
d5c0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
d5d0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  By = 0;.      p-
d5e0: 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79  >disallowOrderBy
d5f0: 20 3d 20 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a   = pOrderBy!=0;.
d600: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
d610: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d620: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d630: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
d640: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
d650: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d660: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d670: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d680: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
d690: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
d6a0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d6b0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d6c0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
d6d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
d6e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
d6f0: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
d700: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d710: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
d720: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
d730: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
d740: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
d750: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  p->iOffset = -1;
d760: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d770: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d780: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d790: 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
d7a0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
d7b0: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
d7c0: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
d7d0: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
d7e0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
d7f0: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
d800: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
d810: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
d820: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
d830: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
d840: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
d850: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
d860: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
d870: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d880: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
d890: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
d8a0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
d8b0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
d8c0: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
d8d0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
d8e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
d8f0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
d900: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
d910: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
d920: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d930: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
d940: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
d950: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
d960: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d980: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
d990: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61   unionTab, iBrea
d9a0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  k);.        iSta
d9b0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
d9c0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
d9d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
d9e0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
d9f0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
da00: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
da10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
da40: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
da50: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
da80: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eak, 0);.       
da90: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
daa0: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
dab0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
dac0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dae0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
daf0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
db00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
db10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
db20: 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
db30: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
db40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
db50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
db60: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
db70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
db80: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
db90: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
dba0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
dbb0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
dbc0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
dbd0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
dbe0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
dbf0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
dc00: 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
dc10: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
dc20: 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
dc30: 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  dr;..      /* IN
dc40: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
dc50: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
dc60: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
dc70: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
dc80: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
dc90: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
dca0: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
dcb0: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
dcc0: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
dcd0: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
dce0: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
dcf0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
dd00: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
dd10: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
dd20: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
dd30: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
dd40: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
dd50: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c  Column(pParse,p,
dd60: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
dd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
dd80: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
dd90: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
dda0: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
ddb0: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
ddc0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
ddd0: 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20  OrderBy);..     
dde0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ddf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
de00: 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 31  penVirtual, tab1
de10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
de20: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56  rt( p->addrOpenV
de30: 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  irt[0] == -1 );.
de40: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
de50: 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b  nVirt[0] = addr;
de60: 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
de70: 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20 3d  most->usesVirt =
de80: 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
de90: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
dea0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
deb0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
dec0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
ded0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
dee0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
def0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
df00: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
df10: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
df20: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab1, 0, 0, 0, a
df30: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
df40: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
df50: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
df60: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
df70: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
df80: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
df90: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
dfa0: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
dfb0: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfd0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
dfe0: 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
dff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
e000: 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d  ddrOpenVirt[1] =
e010: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
e020: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d  >addrOpenVirt[1]
e030: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
e040: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
e050: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
e060: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
e070: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
e080: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
e090: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e0a0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
e0b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e0c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e0d0: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
e0e0: 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
e0f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
e100: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
e110: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
e120: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
e130: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
e140: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
e150: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
e160: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
e170: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
e180: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e190: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
e1a0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
e1b0: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
e1c0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
e1d0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
e1e0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
e1f0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
e200: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e210: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
e220: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
e230: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
e240: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
e250: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
e260: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
e270: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
e280: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
e290: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
e2a0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
e2b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e2c0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
e2d0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e2e0: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
e2f0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e300: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e310: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
e320: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69 53  Break);.      iS
e330: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
e340: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
e350: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
e360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e370: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
e380: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
e390: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
e3a0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
e3b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
e3c0: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
e3d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
e400: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
e410: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
e440: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
e450: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
e460: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
e470: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
e480: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
e490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e4a0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e4b0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
e4c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e4d0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
e4e0: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
e4f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e500: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
e510: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
e520: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
e530: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
e540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
e560: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
e570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e580: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
e590: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
e5a0: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
e5b0: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
e5c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
e5d0: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
e5e0: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
e5f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
e600: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
e610: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
e620: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
e630: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
e640: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
e650: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e660: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
e670: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
e680: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
e690: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
e6a0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
e6b0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
e6c0: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
e6d0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
e6e0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
e6f0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e700: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
e710: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
e720: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
e730: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
e740: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
e750: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
e760: 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
e770: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e780: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
e790: 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
e7a0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
e7b0: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
e7c0: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
e7d0: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
e7e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
e7f0: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
e800: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
e810: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
e820: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
e830: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
e840: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
e850: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
e860: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e870: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
e880: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
e890: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
e8a0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
e8b0: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
e8c0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
e8d0: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
e8e0: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
e8f0: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
e900: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
e910: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
e920: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
e930: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
e940: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
e950: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
e960: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
e970: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
e980: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
e990: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
e9a0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
e9b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
e9c0: 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 56  erBy || p->usesV
e9d0: 69 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  irt ){.    int i
e9e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ea00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
ea10: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ea20: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
ea30: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
ea40: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
ea50: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
ea60: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ea80: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
ea90: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
eaa0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
eab0: 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20  Seq **apColl;.  
eac0: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70    CollSeq **aCop
ead0: 79 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  y;..    assert( 
eae0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
eaf0: 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   );.    pKeyInfo
eb00: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
eb10: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
eb20: 29 2b 6e 43 6f 6c 2a 32 2a 73 69 7a 65 6f 66 28  )+nCol*2*sizeof(
eb30: 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
eb40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
eb50: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
eb60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
eb70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
eb80: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
eb90: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
eba0: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
ebb0: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
ebc0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
ebd0: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
ebe0: 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
ebf0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
ec00: 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
ec10: 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
ec20: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
ec30: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ec40: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
ec50: 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
ec60: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
ec70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
ec80: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
ec90: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
eca0: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
ecb0: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
ecc0: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
ecd0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
ece0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
ecf0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
ed00: 6e 56 69 72 74 5b 69 5d 3b 0a 20 20 20 20 20 20  nVirt[i];.      
ed10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
ed20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ed30: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
ed40: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
ed50: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
ed60: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
ed70: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
ed80: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
ed90: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
eda0: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
edb0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
edc0: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
edd0: 6e 56 69 72 74 5b 31 5d 3c 30 20 29 3b 0a 20 20  nVirt[1]<0 );.  
ede0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
edf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ee00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ee10: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
ee20: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ee30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ee40: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
ee50: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
ee60: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
ee70: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
ee80: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
ee90: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
eea0: 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
eeb0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
eec0: 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 45     int nOrderByE
eed0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
eee0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
eef0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38 20   addr;.      u8 
ef00: 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20  *pSortOrder;..  
ef10: 20 20 20 20 61 43 6f 70 79 20 3d 20 28 43 6f 6c      aCopy = (Col
ef20: 6c 53 65 71 2a 2a 29 26 70 4b 65 79 49 6e 66 6f  lSeq**)&pKeyInfo
ef30: 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  [1];.      pSort
ef40: 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
ef50: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
ef60: 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d  u8*)&aCopy[nCol]
ef70: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  ;.      memcpy(a
ef80: 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
ef90: 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
efa0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20  of(CollSeq*));. 
efb0: 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
efc0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
efd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
efe0: 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
eff0: 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
f000: 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
f010: 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
f020: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
f030: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
f040: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
f050: 20 70 4f 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a   pOTerm->zName;.
f060: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f070: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
f080: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
f090: 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20  Column<nCol );. 
f0a0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
f0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   ){.          *a
f0c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
f0d0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
f0e0: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b  rse, zName, -1);
f0f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f100: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
f110: 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
f120: 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
f130: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
f140: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
f150: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
f160: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
f170: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
f180: 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
f190: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
f1a0: 6e 56 69 72 74 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nVirt[2]>=0 );. 
f1b0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
f1c0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3b 0a  ddrOpenVirt[2];.
f1d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f1e0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
f1f0: 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  r, p->pEList->nE
f200: 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b  xpr+2);.      pK
f210: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
f220: 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a 20   nOrderByExpr;. 
f230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f240: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
f250: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
f260: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
f270: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b  NDOFF);.      pK
f280: 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  eyInfo = 0;.    
f290: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
f2a0: 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
f2b0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f2c0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
f2d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
f2e0: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
f2f0: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
f300: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75  lect_end:.  retu
f310: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
f320: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
f330: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
f340: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
f350: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
f360: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
f370: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
f380: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
f390: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
f3a0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
f3b0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
f3c0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
f3d0: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
f3e0: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
f3f0: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
f400: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
f410: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
f420: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
f430: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f440: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
f450: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
f460: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
f470: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
f480: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
f490: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
f4a0: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
f4b0: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
f4c0: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
f4d0: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
f4e0: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
f4f0: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
f500: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
f510: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
f520: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
f530: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
f540: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
f550: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
f560: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
f570: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
f580: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
f590: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
f5a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
f5b0: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
f5c0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
f5d0: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
f5e0: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
f5f0: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
f600: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
f610: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
f620: 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
f630: 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
f640: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
f650: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
f660: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
f670: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
f680: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
f690: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
f6a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
f6b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
f6c0: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
f6d0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
f6e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
f6f0: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
f700: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
f710: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
f720: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
f730: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
f740: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
f750: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
f760: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
f770: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f780: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
f790: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
f7a0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
f7b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
f7c0: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
f7d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
f7e0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
f7f0: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
f800: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
f810: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
f820: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
f830: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
f840: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
f850: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
f860: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
f870: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
f880: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
f890: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
f8a0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
f8b0: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
f8c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f8d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
f8e0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
f8f0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
f900: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
f910: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
f920: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
f930: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
f940: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
f950: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
f960: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
f970: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
f980: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
f990: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
f9a0: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
f9b0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
f9c0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
f9d0: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
f9e0: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
f9f0: 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74    pExpr->pSelect
fa00: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fa10: 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63  Dup(pNew->pSelec
fa20: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
fa30: 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
fa40: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
fa50: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
fa60: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
fa70: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
fa80: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
fa90: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
faa0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
fab0: 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
fac0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
fad0: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
fae0: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
faf0: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
fb00: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
fb10: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
fb20: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
fb30: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
fb40: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
fb50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
fb60: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
fb70: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
fb80: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
fb90: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
fba0: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
fbb0: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
fbc0: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
fbd0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
fbe0: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
fbf0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
fc00: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
fc10: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
fc20: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
fc30: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
fc40: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  t(p->pEList, iTa
fc50: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
fc60: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
fc70: 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
fc80: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
fc90: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
fca0: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
fcb0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
fcc0: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
fcd0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
fce0: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70  );.  substExpr(p
fcf0: 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
fd00: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
fd10: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
fd20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
fd30: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
fd40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
fd50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fd60: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
fd70: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
fd80: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
fd90: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
fda0: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
fdb0: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
fdc0: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
fdd0: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
fde0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
fdf0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
fe00: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
fe10: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
fe20: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
fe30: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
fe40: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
fe50: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
fe60: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
fe70: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
fe80: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
fe90: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
fea0: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
feb0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
fec0: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
fed0: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
fee0: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
fef0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
ff00: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
ff10: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
ff20: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
ff30: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
ff40: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
ff50: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
ff60: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
ff70: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
ff80: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
ff90: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
ffa0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
ffb0: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
ffc0: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
ffd0: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
ffe0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
fff0: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
10000 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
10010 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
10020 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
10030 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
10040 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10050 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
10060 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
10070 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
10080 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
10090 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
100a0 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
100b0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
100c0 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
100d0 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
100e0 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
100f0 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
10100 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
10110 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
10120 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
10130 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
10140 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
10150 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
10160 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
10170 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10180 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10190 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
101a0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
101b0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
101c0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
101d0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
101e0 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
101f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
10200 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
10210 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10220 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10230 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
10240 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
10250 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
10260 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
10270 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
10280 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10290 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
102a0 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
102b0 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
102c0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
102d0 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
102e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
102f0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
10300 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
10310 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10320 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
10330 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
10340 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
10350 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
10360 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
10370 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
10380 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
10390 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
103a0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
103b0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
103c0 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
103d0 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
103e0 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
103f0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
10400 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
10410 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
10420 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10430 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10440 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
10450 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
10460 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
10470 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
10480 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
10490 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
104a0 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
104b0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
104c0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
104d0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
104e0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
104f0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
10500 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
10510 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
10520 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
10530 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
10540 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
10550 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
10560 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
10570 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
10580 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
10590 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
105a0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
105b0 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
105c0 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
105d0 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
105e0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
105f0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
10600 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
10610 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a  oth use LIMIT.**
10620 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
10630 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
10640 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a   use OFFSET.**.*
10650 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
10660 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
10670 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
10680 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
10690 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
106a0 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
106b0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
106c0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
106d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
106e0 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
106f0 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
10700 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
10710 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
10720 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
10730 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
10740 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
10750 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
10760 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
10770 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
10780 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
10790 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
107a0 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
107b0 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
107c0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
107d0 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
107e0 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
107f0 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
10800 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
10810 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
10820 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
10830 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
10840 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ry(.  Parse *pPa
10850 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
10860 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
10870 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10880 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
10890 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
108a0 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
108b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
108c0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
108d0 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
108e0 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
108f0 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
10900 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
10910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
10920 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
10930 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
10940 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
10950 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
10960 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
10970 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
10980 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
10990 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ns */.){.  Selec
109a0 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
109b0 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
109c0 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
109d0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
109e0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
109f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
10a00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
10a10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
10a20 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
10a30 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
10a40 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
10a50 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
10a60 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
10a70 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
10a80 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
10a90 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
10aa0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
10ab0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
10ac0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
10ad0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
10ae0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10af0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10b00 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
10b10 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
10b20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10b30 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
10b40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
10b50 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
10b60 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
10b70 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ry */..  /* Chec
10b80 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
10b90 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
10ba0 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
10bb0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  f not..  */.  if
10bc0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
10bd0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
10be0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
10bf0 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
10c00 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
10c10 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
10c20 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
10c30 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  om];.  pSub = pS
10c40 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
10c50 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
10c60 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
10c70 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
10c80 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ca0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
10cb0 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
10cc0 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
10cd0 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
10ce0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
10cf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
10d00 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
10d10 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
10d20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
10d30 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
10d40 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
10d50 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
10d60 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
10d70 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
10d80 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
10d90 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
10da0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
10db0 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
10dc0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10dd0 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
10de0 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
10df0 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
10e00 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
10e10 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
10e20 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
10e30 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
10e40 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
10e50 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
10e60 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
10e70 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
10e80 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
10e90 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
10ea0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
10eb0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
10ec0 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
10ed0 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
10ee0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
10f10 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
10f20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
10f30 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
10f60 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
10f70 69 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73  if( (pSub->isDis
10f80 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70  tinct || pSub->p
10f90 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
10fa0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
10fb0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20  1 || isAgg) ){  
10fc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
10fd0 69 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38  ictions (4)(5)(8
10fe0 29 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74  )(9) */.     ret
10ff0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20  urn 0;       .  
11000 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  }.  if( p->isDis
11010 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72  tinct && subquer
11020 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
11030 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
11040 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
11050 2f 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61  /.  if( (p->disa
11060 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70  llowOrderBy || p
11070 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70  ->pOrderBy) && p
11080 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
11090 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
110d0 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
110e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
110f0 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
11100 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
11110 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
11120 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
11130 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
11140 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
11150 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
11160 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
11170 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
11180 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
11190 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
111a0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
111b0 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
111c0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
111d0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
111e0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
111f0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
11200 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
11210 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
11220 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
11230 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
11240 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
11250 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  g..  */.  if( pS
11260 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26  ubSrc->nSrc>1 &&
11270 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72   iFrom>0 && (pSr
11280 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f  c->a[iFrom-1].jo
11290 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
112a0 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
112b0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
112c0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
112d0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
112e0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
112f0 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
11300 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
11310 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
11320 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
11330 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
11340 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
11350 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
11360 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
11370 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
11380 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
11390 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
113a0 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
113b0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
113c0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
113d0 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
113e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
113f0 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
11400 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
11410 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
11420 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
11430 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
11440 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
11450 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
11460 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
11470 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
11480 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
11490 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
114a0 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30  */.  if( iFrom>0
114b0 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72   && (pSrc->a[iFr
114c0 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  om-1].jointype &
114d0 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
114e0 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57       && pSub->pW
114f0 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72  here!=0 ){.    r
11500 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
11510 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
11520 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
11530 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ans flattening i
11540 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20  s permitted for 
11550 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74  the.  ** iFrom-t
11560 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
11570 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
11580 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
11590 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61   */..  /* Move a
115a0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
115b0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
115c0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
115d0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
115e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
115f0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
11600 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
11610 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
11620 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
11630 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
11640 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
11650 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
11660 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
11670 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
11680 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
11690 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
116a0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
116b0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
116c0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
116d0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
116e0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
116f0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
11700 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
11710 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
11720 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
11730 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
11740 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
11750 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61  g in..  */.  iPa
11760 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
11770 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20  >iCursor;.  {.  
11780 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20    int nSubSrc = 
11790 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20  pSubSrc->nSrc;. 
117a0 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20     int jointype 
117b0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
117c0 74 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  type;..    sqlit
117d0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
117e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29   pSubitem->pTab)
117f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
11800 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61  (pSubitem->zData
11810 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
11820 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
11830 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
11840 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
11850 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  >zAlias);.    if
11860 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
11870 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
11880 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
11890 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
118a0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
118b0 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
118c0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
118d0 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
118e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
118f0 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
11900 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
11910 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
11920 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
11930 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
11940 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
11950 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
11960 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
11970 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
11980 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
11990 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
119a0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
119b0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
119c0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
119d0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
119e0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
119f0 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
11a00 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
11a10 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
11a20 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
11a30 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
11a40 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
11a50 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
11a60 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
11a70 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
11a80 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
11a90 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
11aa0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
11ab0 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
11ac0 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
11ad0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
11ae0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
11af0 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
11b20 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
11b30 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
11b40 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
11b50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11b60 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
11b70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11b80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
11b90 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
11ba0 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
11bb0 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
11bc0 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
11bd0 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
11be0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
11bf0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
11c00 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
11c10 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
11c20 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
11c30 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
11c40 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
11c50 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
11c60 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
11c70 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
11c80 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
11c90 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
11ca0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
11cb0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
11cc0 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
11cd0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
11ce0 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
11cf0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
11d00 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
11d10 71 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68  qliteStrNDup((ch
11d20 61 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e  ar*)pExpr->span.
11d30 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  z, pExpr->span.n
11d40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
11d50 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
11d60 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
11d70 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
11d80 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
11d90 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
11da0 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  (p->pHaving, iPa
11db0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
11dc0 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  st);.  }.  if( p
11dd0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
11de0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11df0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
11e00 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
11e10 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
11e20 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65  .    pSub->pOrde
11e30 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rBy = 0;.  }else
11e40 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
11e50 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
11e60 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
11e70 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
11e80 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  ->pEList);.  }. 
11e90 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
11ea0 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20  e ){.    pWhere 
11eb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
11ec0 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a  (pSub->pWhere);.
11ed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68    }else{.    pWh
11ee0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ere = 0;.  }.  i
11ef0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
11f00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11f10 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  p->pHaving==0 );
11f20 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
11f30 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
11f40 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68   p->pWhere = pWh
11f50 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78  ere;.    substEx
11f60 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
11f70 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
11f80 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48  List);.    p->pH
11f90 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
11fa0 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e  xprAnd(p->pHavin
11fb0 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  g, sqlite3ExprDu
11fc0 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29  p(pSub->pHaving)
11fd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
11fe0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
11ff0 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
12000 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
12010 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f  stDup(pSub->pGro
12020 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  upBy);.  }else{.
12030 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d      substExpr(p-
12040 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
12050 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
12060 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
12070 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
12080 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  p->pWhere, pWher
12090 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
120a0 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
120b0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
120c0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
120d0 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75  r or the.  ** ou
120e0 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
120f0 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70  tinct. .  */.  p
12100 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
12110 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
12120 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
12130 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c  ;..  /*.  ** SEL
12140 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
12150 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
12160 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
12170 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a   x OFFSET y;.  *
12180 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65  *.  ** One is te
12190 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
121a0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
121b0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
121c0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a  s.  But this.  *
121d0 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
121e0 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
121f0 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a  is negative..  *
12200 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
12210 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  imit ){.    p->p
12220 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
12230 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e  imit;.    pSub->
12240 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  pLimit = 0;.  }.
12250 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
12260 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
12270 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
12280 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
12290 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
122a0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
122b0 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20  tDelete(pSub);. 
122c0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
122d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
122e0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
122f0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45  * Analyze the SE
12300 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
12310 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61  assed in as an a
12320 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
12330 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d  f it.** is a sim
12340 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
12350 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74  () query.  If it
12360 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65   is and this que
12370 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74  ry can be.** sat
12380 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73  isfied using a s
12390 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68  ingle seek to th
123a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65  e beginning or e
123b0 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a  nd of an index,.
123c0 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65  ** then generate
123d0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
123e0 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65  is SELECT and re
123f0 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73  turn 1.  If this
12400 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69   is not a .** si
12410 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
12420 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20  x() query, then 
12430 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20  return 0;.**.** 
12440 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f  A simply min() o
12450 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f  r max() query lo
12460 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  oks like this:.*
12470 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d  *.**    SELECT m
12480 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65  in(a) FROM table
12490 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d  ;.**    SELECT m
124a0 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65  ax(a) FROM table
124b0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ;.**.** The quer
124c0 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20  y may have only 
124d0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
124e0 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d  n its FROM argum
124f0 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63  ent.  There.** c
12500 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42  an be no GROUP B
12510 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57  Y or HAVING or W
12520 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54  HERE clauses.  T
12530 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75  he result set mu
12540 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e  st.** be the min
12550 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61  () or max() of a
12560 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f   single column o
12570 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
12580 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74  e column.** in t
12590 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  he min() or max(
125a0 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
125b0 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a  be indexed..**.*
125c0 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73  * The parameters
125d0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
125e0 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73   are the same as
125f0 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65   for sqlite3Sele
12600 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65  ct()..** See the
12610 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
12620 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20  on that routine 
12630 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12640 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
12650 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65  tatic int simple
12660 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73  MinMaxQuery(Pars
12670 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
12680 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c  t *p, int eDest,
12690 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45   int iParm){.  E
126a0 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e  xpr *pExpr;.  in
126b0 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20  t iCol;.  Table 
126c0 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a  *pTab;.  Index *
126d0 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65  pIdx;.  int base
126e0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
126f0 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70  nt seekOp;.  Exp
12700 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a  rList *pEList, *
12710 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20  pList, eList;.  
12720 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
12730 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a  item eListItem;.
12740 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
12750 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e  .  int brk;.  in
12760 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  t iDb;..  /* Che
12770 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69  ck to see if thi
12780 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  s query is a sim
12790 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
127a0 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72  () query.  Retur
127b0 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69  n.  ** zero if i
127c0 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a  t is  not..  */.
127d0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
127e0 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20  y || p->pHaving 
127f0 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  || p->pWhere ) r
12800 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20  eturn 0;.  pSrc 
12810 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28  = p->pSrc;.  if(
12820 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
12830 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c   return 0;.  pEL
12840 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
12850 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
12860 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
12870 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45   0;.  pExpr = pE
12880 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
12890 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
128a0 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
128b0 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
128c0 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
128d0 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
128e0 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  st==0 || pList->
128f0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
12900 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
12910 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72  ->token.n!=3 ) r
12920 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
12930 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
12940 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
12950 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30  en.z,"min",3)==0
12960 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
12970 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65   OP_Rewind;.  }e
12980 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
12990 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
129a0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
129b0 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
129c0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
129d0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
129e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
129f0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
12a00 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
12a10 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
12a20 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
12a30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
12a40 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
12a50 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
12a60 54 61 62 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  Tab;...  /* If w
12a70 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69  e get to here, i
12a80 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72  t means the quer
12a90 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  y is of the corr
12aa0 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43  ect form..  ** C
12ab0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
12ac0 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64  e we have an ind
12ad0 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78  ex and make pIdx
12ae0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20   point to the.  
12af0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  ** appropriate i
12b00 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69  ndex.  If the mi
12b10 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
12b20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  on an INTEGER PR
12b30 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63  IMARY.  ** key c
12b40 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20  olumn, no index 
12b50 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  is necessary so 
12b60 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c  set pIdx to NULL
12b70 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73  .  If no.  ** us
12b80 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f  able index is fo
12b90 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  und, return 0.. 
12ba0 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30   */.  if( iCol<0
12bb0 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30   ){.    pIdx = 0
12bc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43  ;.  }else{.    C
12bd0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
12be0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
12bf0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
12c00 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  );.    for(pIdx=
12c10 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
12c20 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
12c30 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
12c40 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
12c50 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
12c60 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
12c70 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20  n[0]==iCol && . 
12c80 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
12c90 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
12ca0 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c  >azColl[0], pCol
12cb0 6c 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  l->zName) ){.   
12cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12cd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12ce0 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
12cf0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
12d00 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
12d10 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
12d20 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
12d30 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
12d40 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
12d50 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
12d60 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
12d70 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
12d80 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
12d90 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
12da0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
12db0 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
12dc0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
12dd0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
12de0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12df0 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
12e00 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
12e10 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
12e20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
12e30 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
12e40 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
12e50 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
12e60 44 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61  Dest==SRT_Virtua
12e70 6c 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  lTab ){.    sqli
12e80 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12e90 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20  OP_OpenVirtual, 
12ea0 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
12eb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20    /* Generating 
12ec0 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65  code to find the
12ed0 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e   min or the max.
12ee0 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20    Basically all 
12ef0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
12f00 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66  do is find the f
12f10 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74  irst or the last
12f20 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68   entry in the ch
12f30 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a  osen index.  If.
12f40 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f    ** the min() o
12f50 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68  r max() is on th
12f60 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
12f70 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64  Y KEY, then find
12f80 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
12f90 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  or last entry in
12fa0 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
12fb0 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
12fc0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12fd0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
12fe0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
12ff0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
13000 7c 7c 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73  || pTab->isTrans
13010 69 65 6e 74 20 29 3b 0a 20 20 73 71 6c 69 74 65  ient );.  sqlite
13020 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
13030 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
13040 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
13050 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
13060 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
13070 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62  Tab->zName);.  b
13080 61 73 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  ase = pSrc->a[0]
13090 2e 69 43 75 72 73 6f 72 3b 0a 20 20 62 72 6b 20  .iCursor;.  brk 
130a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
130b0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
130c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
130d0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 62 72  rs(pParse, p, br
130e0 6b 29 3b 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  k);.  if( pSrc->
130f0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d 3d 30 20  a[0].pSelect==0 
13100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  ){.    sqlite3Op
13110 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
13120 62 61 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2c  base, iDb, pTab,
13130 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
13140 20 7d 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30   }.  if( pIdx==0
13150 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13160 64 62 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b  dbeAddOp(v, seek
13170 4f 70 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Op, base, 0);.  
13180 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76  }else{.    /* Ev
13190 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 63 75  en though the cu
131a0 72 73 6f 72 20 75 73 65 64 20 74 6f 20 6f 70 65  rsor used to ope
131b0 6e 20 74 68 65 20 69 6e 64 65 78 20 68 65 72 65  n the index here
131c0 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a   is closed.    *
131d0 2a 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20 73  * as soon as a s
131e0 69 6e 67 6c 65 20 76 61 6c 75 65 20 68 61 73 20  ingle value has 
131f0 62 65 65 6e 20 72 65 61 64 20 66 72 6f 6d 20 69  been read from i
13200 74 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20  t, allocate it. 
13210 20 20 20 2a 2a 20 75 73 69 6e 67 20 28 70 50 61     ** using (pPa
13220 72 73 65 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20  rse->nTab++) to 
13230 70 72 65 76 65 6e 74 20 74 68 65 20 63 75 72 73  prevent the curs
13240 6f 72 20 69 64 20 66 72 6f 6d 20 62 65 69 6e 67  or id from being
13250 20 0a 20 20 20 20 2a 2a 20 72 65 75 73 65 64 2e   .    ** reused.
13260 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
13270 6e 74 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt for statement
13280 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 0a 20  s of the form . 
13290 20 20 20 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e     ** "INSERT IN
132a0 54 4f 20 78 20 53 45 4c 45 43 54 20 6d 61 78 28  TO x SELECT max(
132b0 29 20 46 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a  ) FROM x"..    *
132c0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 3b 0a  /.    int iIdx;.
132d0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
132e0 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
132f0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
13300 70 49 64 78 29 3b 0a 20 20 20 20 69 49 64 78 20  pIdx);.    iIdx 
13310 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
13320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
13330 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
13340 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
13350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13360 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
13370 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  , iDb, 0);.    s
13380 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
13390 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
133a0 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  dx, pIdx->tnum, 
133b0 0a 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29  .        (char*)
133c0 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  pKey, P3_KEYINFO
133d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 69  _HANDOFF);.    i
133e0 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65  f( seekOp==OP_Re
133f0 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  wind ){.      sq
13400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13410 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
13420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13430 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13440 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29  akeRecord, 1, 0)
13450 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d  ;.      seekOp =
13460 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20   OP_MoveGt;.    
13470 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
13480 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
13490 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
134a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
134b0 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
134c0 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
134d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
134e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
134f0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
13500 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13510 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20  P_MoveGe, base, 
13520 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e  0);.  }.  eList.
13530 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d  nExpr = 1;.  mem
13540 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20  set(&eListItem, 
13550 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49  0, sizeof(eListI
13560 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61  tem));.  eList.a
13570 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20   = &eListItem;. 
13580 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70   eList.a[0].pExp
13590 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c  r = pExpr;.  sel
135a0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
135b0 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20  rse, p, &eList, 
135c0 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65  0, 0, 0, -1, eDe
135d0 73 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20  st, iParm, brk, 
135e0 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
135f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13600 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
13610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13620 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
13630 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  , 0);.  .  retur
13640 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
13650 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
13660 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
13670 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
13680 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
13690 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
136a0 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
136b0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45  n..**.** An ORDE
136c0 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
136d0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
136e0 70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61  pressions.  If a
136f0 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ny expression.**
13700 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
13710 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
13720 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  at expression is
13730 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
13740 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
13750 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  g entry in the r
13760 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
13770 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
13780 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20  OrderGroupBy(.  
13790 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
137a0 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  ,     /* Name co
137b0 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
137c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  ECT statement. *
137d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
137e0 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
137f0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
13800 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
13810 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
13820 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13830 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
13840 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
13850 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
13860 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
13870 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
13880 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45  pEList = pNC->pE
13890 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  List;     /* The
138a0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
138b0 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50  he SELECT */.  P
138c0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
138d0 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  NC->pParse;     
138e0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
138f0 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
13900 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  */.  assert( pEL
13910 69 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f  ist );..  if( pO
13920 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
13930 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
13940 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
13950 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  pr; i++){.    in
13960 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72  t iCol;.    Expr
13970 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
13980 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
13990 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
139a0 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
139b0 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
139c0 28 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  ( iCol>0 && iCol
139d0 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
139e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
139f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
13a00 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
13a10 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
13a20 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
13a30 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
13a40 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
13a50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13a60 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13a70 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
13a80 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63          "%s BY c
13a90 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
13aa0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
13ab0 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
13ac0 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
13ad0 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c   and %d", zType,
13ae0 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
13af0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
13b00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
13b10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13b20 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13b30 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20  eNames(pNC, pE) 
13b40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13b50 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
13b60 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
13b70 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
13b80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13b90 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
13ba0 20 20 20 20 20 20 22 25 73 20 42 59 20 74 65 72        "%s BY ter
13bb0 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
13bc0 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
13bd0 61 6e 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ants", zType);. 
13be0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13bf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13c00 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
13c10 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c  is routine resol
13c20 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73  ves any names us
13c30 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
13c40 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73   set of the.** s
13c50 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73  upplied SELECT s
13c60 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
13c70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13c80 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64  t being resolved
13c90 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
13ca0 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72  ect, then pOuter
13cb0 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  NC is a pointer 
13cc0 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65  to the NameConte
13cd0 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  xt .** of the pa
13ce0 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  rent SELECT..*/.
13cf0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
13d00 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73  tResolve(.  Pars
13d10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13d20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
13d30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
13d40 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13d50 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
13d60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
13d70 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
13d80 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
13d90 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74  erNC  /* The out
13da0 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  er name context.
13db0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
13dc0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
13dd0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
13de0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20   /* Result set. 
13df0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69  /* For-loop vari
13e20 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  able used in mul
13e30 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a  tiple places */.
13e40 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
13e50 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
13e60 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  Local name-conte
13e70 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
13e80 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
13e90 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20     /* The group 
13ea0 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
13eb0 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
13ec0 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
13ed0 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  e, return immedi
13ee0 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ately. */.  if( 
13ef0 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b  p->isResolved ){
13f00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f  .    assert( !pO
13f10 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65  uterNC );.    re
13f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13f30 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c    }.  p->isResol
13f40 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ved = 1;..  /* I
13f50 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72  f there have alr
13f60 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73  eady been errors
13f70 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f  , do nothing. */
13f80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
13f90 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Err>0 ){.    ret
13fa0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  ;.  }..  /* Prep
13fc0 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  are the select s
13fd0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63  tatement. This c
13fe0 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  all will allocat
13ff0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20  e all cursors.  
14000 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  ** required to h
14010 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73  andle the tables
14020 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
14030 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
14040 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
14050 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
14060 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
14070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14080 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ROR;.  }..  /* R
14090 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
140a0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
140b0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
140c0 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
140d0 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
140e0 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
140f0 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
14100 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
14110 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ontext..  */.  m
14120 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
14130 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
14140 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
14150 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se;.  if( sqlite
14160 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
14170 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
14180 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  t) ||.      sqli
14190 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
141a0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66  mes(&sNC, p->pOf
141b0 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
141c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
141d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
141e0 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
141f0 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
14200 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65  s to ExprResolve
14210 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20  Names() to.  ** 
14220 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  resolve the expr
14230 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a  ession-list..  *
14240 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67  /.  sNC.allowAgg
14250 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63   = 1;.  sNC.pSrc
14260 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
14270 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
14280 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65  uterNC;..  /* Re
14290 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
142a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
142b0 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
142c0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70  pEList;.  if( !p
142d0 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53  EList ) return S
142e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66  QLITE_ERROR;.  f
142f0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
14300 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
14310 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
14320 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
14330 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14340 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
14350 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
14360 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14370 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
14380 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14390 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
143a0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
143b0 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
143c0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
143d0 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f   .  ** expressio
143e0 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
143f0 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
14400 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
14410 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
14420 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
14430 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70  sAgg );.  pGroup
14440 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
14450 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  ;.  if( pGroupBy
14460 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29   || sNC.hasAgg )
14470 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d  {.    p->isAgg =
14480 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
14490 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
144a0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
144b0 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
144c0 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
144d0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
144e0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
144f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14500 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
14510 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
14520 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14530 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
14540 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
14550 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
14560 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
14570 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
14580 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
14590 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
145a0 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
145b0 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
145c0 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
145d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
145e0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
145f0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
14600 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
14610 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
14620 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
14630 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
14640 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
14650 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
14660 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
14670 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
14680 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
14690 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
146a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
146b0 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
146c0 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
146d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
146e0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
146f0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
14700 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
14710 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
14720 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
14730 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ||.      sqlite3
14740 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
14750 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
14760 67 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63  g) ||.      proc
14770 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
14780 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42  &sNC, p->pOrderB
14790 79 2c 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20  y, "ORDER") ||. 
147a0 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65       processOrde
147b0 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
147c0 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22  GroupBy, "GROUP"
147d0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
147e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
147f0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
14800 75 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  ure the GROUP BY
14810 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
14820 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61   contain aggrega
14830 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  te functions..  
14840 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  */.  if( pGroupB
14850 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
14860 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
14870 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72  Item;.  .    for
14880 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
14890 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
148a0 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
148b0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
148c0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
148d0 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
148e0 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
148f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14900 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
14910 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14920 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
14930 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
14940 20 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42      "the GROUP B
14950 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
14960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14970 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
14980 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
14990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
149a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
149b0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
149c0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
149d0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
149e0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
149f0 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
14a00 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
14a10 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
14a20 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
14a30 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
14a40 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
14a50 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f  utine simply sto
14a60 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
14a70 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
14a80 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
14a90 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
14aa0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
14ab0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
14ac0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
14ad0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
14ae0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
14af0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
14b00 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
14b10 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
14b20 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  nc+pAggInfo->nCo
14b30 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lumn==0 ){.    r
14b40 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
14b50 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
14b60 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
14b70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14b80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e  AddOp(v, OP_MemN
14b90 75 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ull, pAggInfo->a
14ba0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b  Col[i].iMem, 0);
14bb0 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
14bc0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
14bd0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
14be0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
14bf0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
14c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14c10 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75   OP_MemNull, pFu
14c20 6e 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  nc->iMem, 0);.  
14c30 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
14c40 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
14c50 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
14c60 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
14c70 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d    if( pE->pList=
14c80 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d  =0 || pE->pList-
14c90 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
14ca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14cb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
14cc0 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67  STINCT in aggreg
14cd0 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ate must be foll
14ce0 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20  owed ".         
14cf0 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73    "by an express
14d00 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ion");.        p
14d10 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
14d20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
14d30 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
14d40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
14d50 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
14d60 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
14d70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
14d80 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
14d90 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
14da0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
14db0 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
14de0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
14df0 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
14e00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14e10 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
14e20 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
14e30 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
14e40 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
14e50 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
14e60 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
14e70 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
14e80 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
14e90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14ea0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
14eb0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
14ec0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14ed0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
14ee0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
14ef0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
14f00 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
14f10 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
14f20 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
14f30 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
14f40 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
14f50 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ->pList;.    sql
14f60 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
14f70 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
14f80 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
14f90 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a  ist->nExpr : 0,.
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
14fc0 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44  >pFunc, P3_FUNCD
14fd0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
14fe0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
14ff0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
15000 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
15010 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
15020 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
15030 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
15040 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
15050 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
15060 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15070 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
15080 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
15090 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
150a0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
150b0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
150c0 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
150d0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
150e0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
150f0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
15100 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
15110 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
15120 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
15130 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
15140 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
15150 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
15160 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
15170 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  = pF->pExpr->pLi
15180 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  st;.    if( pLis
15190 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
151a0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
151b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
151c0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
151d0 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20  arse, pList);.  
151e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
151f0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Arg = 0;.    }. 
15200 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
15210 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
15220 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
15230 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
15240 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
15250 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
15260 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
15270 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  (v, pF->iDistinc
15280 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
15290 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
152a0 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65  ( pF->pFunc->nee
152b0 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
152c0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
152d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
152e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
152f0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
15300 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
15310 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
15320 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
15330 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  <pList->nExpr; j
15340 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
15350 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
15360 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
15370 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
15380 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
15390 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
153a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
153b0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
153c0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
153d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
153e0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
153f0 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
15400 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
15410 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
15420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
15430 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  3(v, OP_AggStep,
15440 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c   pF->iMem, nArg,
15450 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
15460 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
15470 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
15480 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15490 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
154a0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
154b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
154c0 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
154d0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
154e0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
154f0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
15500 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15510 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
15520 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
15530 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15540 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
15550 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
15560 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
15570 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ode = 0;.}.../*.
15580 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15590 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
155a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
155b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
155c0 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
155d0 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
155e0 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
155f0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
15600 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
15610 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
15620 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
15630 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
15640 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15670 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
15680 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
15690 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
156a0 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
156b0 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
156c0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
156d0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
156e0 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
156f0 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
15700 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
15710 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
15720 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
15730 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  of table iParm..
15740 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
15750 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
15760 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
15770 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
15780 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
15790 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
157a0 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
157b0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
157c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
157d0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
157e0 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
157f0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
15800 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15810 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
15820 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
15830 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
15840 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
15850 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
15860 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
15870 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
15880 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
15890 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
158a0 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
158b0 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
158c0 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
158d0 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
158e0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
158f0 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
15900 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
15910 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
15920 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
15930 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
15940 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
15950 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
15960 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
15970 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
15980 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
15990 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
159a0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
159b0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
159c0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
159d0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
159e0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
159f0 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
15a00 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
15a10 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
15a20 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
15a30 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
15a40 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
15a50 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
15a60 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
15a70 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
15a80 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
15a90 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
15aa0 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
15ab0 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
15ac0 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
15ad0 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
15ae0 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
15af0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
15b00 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
15b10 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
15b20 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
15b30 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
15b40 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
15b50 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
15b60 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
15b70 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
15b80 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
15b90 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
15ba0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
15bb0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
15bc0 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
15bd0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
15be0 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
15bf0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
15c00 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
15c10 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
15c20 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
15c30 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
15c70 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
15c80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
15c90 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
15ca0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
15cb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15cc0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
15cd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
15ce0 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
15cf0 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
15d00 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
15d10 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
15d20 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
15d30 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
15d40 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
15d50 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
15d60 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
15d70 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
15d80 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
15d90 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
15da0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
15db0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
15dc0 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
15dd0 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
15de0 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
15df0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
15e00 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
15e10 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
15e20 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
15e30 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
15e40 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
15e50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
15e60 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15e70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15e80 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
15e90 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15eb0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15ec0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
15ed0 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
15ef0 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
15f00 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
15f10 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
15f20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
15f30 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
15f40 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
15f50 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
15f60 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
15f70 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
15f80 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
15f90 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
15fa0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
15fb0 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
15fc0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
15fd0 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
15fe0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
15ff0 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
16000 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16010 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
16020 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
16030 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16050 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
16060 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
16070 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
16080 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
16090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
160a0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
160b0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
160c0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
160d0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
160e0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
160f0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
16100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
16110 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
16120 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
16130 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16150 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
16160 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
16170 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
16180 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
16190 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
161a0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
161b0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
161c0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
161d0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
161e0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
161f0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
16200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16210 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
16220 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
16230 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
16240 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
16250 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
16260 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
16270 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
16280 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
16290 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
162a0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
162b0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
162c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
162d0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
162e0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
162f0 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
16300 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
16310 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
16320 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
16330 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
16340 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
16350 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
16360 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
16370 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
16380 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
16390 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
163a0 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
163b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
163c0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
163d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
163e0 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75   an OP_OpenVirtu
163f0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
16400 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
16410 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
16420 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
16430 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
16440 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
16450 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16460 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
16470 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
16480 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70 3d 3d  ry */..  if( p==
16490 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
164a0 6f 63 46 61 69 6c 65 64 28 29 20 7c 7c 20 70 50  ocFailed() || pP
164b0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
164c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
164d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
164e0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
164f0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
16500 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
16510 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
16520 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
16530 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 23 69  (sAggInfo));..#i
16540 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16550 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
16560 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
16570 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
16580 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
16590 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
165a0 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
165b0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
165c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67  .    if( p->pRig
165d0 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20  htmost==0 ){.   
165e0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
165f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f  ;.      for(pLoo
16600 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
16610 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
16620 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
16630 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
16640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16650 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
16660 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
16670 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
16680 66 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ff);.  }.#endif.
16690 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
166a0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >pOrderBy;.  if(
166b0 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
166c0 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
166d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
166e0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
166f0 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
16700 70 50 61 72 73 65 2c 20 70 2c 20 30 29 20 29 7b  pParse, p, 0) ){
16710 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
16720 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  _end;.  }.  p->p
16730 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
16740 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c  By;..  /* Make l
16750 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74  ocal copies of t
16760 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  he parameters fo
16770 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20  r this query..  
16780 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  */.  pTabList = 
16790 70 2d 3e 70 53 72 63 3b 0a 20 20 70 57 68 65 72  p->pSrc;.  pWher
167a0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
167b0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
167c0 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
167d0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
167e0 0a 20 20 69 73 41 67 67 20 3d 20 70 2d 3e 69 73  .  isAgg = p->is
167f0 41 67 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  Agg;.  isDistinc
16800 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
16810 74 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  t;.  pEList = p-
16820 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
16830 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  EList==0 ) goto 
16840 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
16850 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65  * .  ** Do not e
16860 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67  ven attempt to g
16870 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65  enerate any code
16880 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72 65   if we have alre
16890 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72  ady seen.  ** er
168a0 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69 73  rors before this
168b0 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e   routine starts.
168c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
168d0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74  se->nErr>0 ) got
168e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
168f0 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
16900 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
16910 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
16920 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
16930 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
16940 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
16950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16960 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 28 65  UBQUERY.  if( (e
16970 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
16980 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
16990 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
169a0 72 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>1 ){.    sqlit
169b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
169c0 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
169d0 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
169e0 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
169f0 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
16a00 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
16a10 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ssion");.    got
16a20 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
16a30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  }.#endif..  /* O
16a40 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
16a50 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
16a60 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
16a70 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
16a80 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
16a90 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
16aa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
16ab0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
16ac0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
16ad0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16ae0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
16af0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
16b00 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd;..  /* Identi
16b10 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
16b20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
16b30 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
16b40 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
16b50 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
16b60 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
16b70 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
16b80 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
16b90 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
16ba0 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
16bb0 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ack ){.    gener
16bc0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
16bd0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
16be0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
16bf0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16c00 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
16c10 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
16c20 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
16c30 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
16c40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
16c50 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
16c60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
16c70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
16c80 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
16c90 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
16ca0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
16cb0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
16cc0 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74   needRestoreCont
16cd0 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ext;.    struct 
16ce0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
16cf0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
16d00 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20  >a[i];..    if( 
16d10 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pItem->pSelect==
16d20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
16d30 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
16d40 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  me!=0 ){.      z
16d50 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
16d60 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
16d70 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70  Context;.      p
16d80 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
16d90 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ext = pItem->zNa
16da0 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
16db0 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
16dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16dd0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
16de0 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
16df0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
16e00 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  ct(pParse, pItem
16e10 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 56  ->pSelect, SRT_V
16e20 69 72 74 75 61 6c 54 61 62 2c 20 0a 20 20 20 20  irtualTab, .    
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
16e40 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20  em->iCursor, p, 
16e50 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20  i, &isAgg, 0);. 
16e60 20 20 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f     if( needResto
16e70 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20  reContext ){.   
16e80 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
16e90 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
16ea0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20  AuthContext;.   
16eb0 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
16ec0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70  = p->pSrc;.    p
16ed0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
16ee0 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  e;.    if( !Igno
16ef0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
16f00 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72  st) ){.      pOr
16f10 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
16f20 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rBy;.    }.    p
16f30 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
16f40 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69  oupBy;.    pHavi
16f50 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
16f60 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
16f70 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  = p->isDistinct;
16f80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16f90 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  * Check for the 
16fa0 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20  special case of 
16fb0 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  a min() or max()
16fc0 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73   function by its
16fd0 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  elf.  ** in the 
16fe0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f  result set..  */
16ff0 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e  .  if( simpleMin
17000 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
17010 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d   p, eDest, iParm
17020 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  ) ){.    rc = 0;
17030 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
17040 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
17050 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17060 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
17070 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 22  ry that can be "
17080 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20  flattened" into 
17090 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a  its parent..  **
170a0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
170b0 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20  s a possiblity, 
170c0 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e  do so and return
170d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a   immediately.  .
170e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
170f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
17100 69 66 28 20 70 50 61 72 65 6e 74 20 26 26 20 70  if( pParent && p
17110 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20  ParentAgg &&.   
17120 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65     flattenSubque
17130 72 79 28 70 50 61 72 73 65 2c 20 70 50 61 72 65  ry(pParse, pPare
17140 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a  nt, parentTab, *
17150 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67  pParentAgg, isAg
17160 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  g) ){.    if( is
17170 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67  Agg ) *pParentAg
17180 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 1;.    goto 
17190 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
171a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
171b0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
171c0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72 65 73  R BY clause, res
171d0 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61 74 69  olve any collati
171e0 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20 20 2a  on sequences.  *
171f0 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68 61 76  * names that hav
17200 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  e been explicitl
17210 79 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20  y specified and 
17220 63 72 65 61 74 65 20 61 20 73 6f 72 74 69 6e 67  create a sorting
17230 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
17240 2a 20 54 68 69 73 20 73 6f 72 74 69 6e 67 20 69  * This sorting i
17250 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
17260 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  p being unused i
17270 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
17280 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  e .  ** extracte
17290 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
172a0 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20  order.  If that 
172b0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
172c0 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70  n the.  ** OP_Op
172d0 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75  enVirtual instru
172e0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68  ction will be ch
172f0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
17300 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65  oop once.  ** we
17310 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
17320 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
17330 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  ex is not needed
17340 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49  .  The addrSortI
17350 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62  ndex.  ** variab
17360 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
17370 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68  cilitate that ch
17380 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
17390 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
173a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
173b0 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  _item *pTerm;.  
173c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
173d0 6e 66 6f 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  nfo;.    for(i=0
173e0 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79  , pTerm=pOrderBy
173f0 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  ->a; i<pOrderBy-
17400 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 54 65  >nExpr; i++, pTe
17410 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
17420 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b   pTerm->zName ){
17430 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
17440 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73  pExpr->pColl = s
17450 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
17460 53 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72  Seq(pParse, pTer
17470 6d 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  m->zName, -1);. 
17480 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17490 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
174a0 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  r ){.      goto 
174b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
174c0 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  }.    pKeyInfo =
174d0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
174e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
174f0 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64  derBy);.    pOrd
17500 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
17510 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17520 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
17530 56 69 72 74 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Virt[2] = addrSo
17540 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
17550 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
17560 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
17570 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  l, pOrderBy->iEC
17580 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
17590 3e 6e 45 78 70 72 2b 32 2c 20 0a 20 20 20 20 20  >nExpr+2, .     
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
175c0 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
175d0 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
175e0 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
175f0 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
17600 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
17610 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
17620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17630 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
17640 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
17650 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
17660 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  End);..  /* If t
17670 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
17680 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
17690 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
176a0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
176b0 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  */.  if( eDest==
176c0 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29  SRT_VirtualTab )
176d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
176e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
176f0 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c  nVirtual, iParm,
17700 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
17710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
17720 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
17730 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
17740 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
17750 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e  /.  if( isDistin
17760 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  ct ){.    KeyInf
17770 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
17780 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72   distinct = pPar
17790 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
177a0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
177b0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
177c0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
177d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
177e0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
177f0 56 69 72 74 75 61 6c 2c 20 64 69 73 74 69 6e 63  Virtual, distinc
17800 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17820 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
17830 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
17840 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
17850 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
17860 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
17870 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
17880 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
17890 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
178a0 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
178b0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
178c0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
178d0 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72  This case is for
178e0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
178f0 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65  ueries.    ** Be
17900 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
17910 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   scan.    */.   
17920 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
17930 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
17940 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
17950 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 29  here, &pOrderBy)
17960 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
17970 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
17980 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
17990 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
179a0 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
179b0 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
179c0 70 65 6e 56 69 72 74 75 61 6c 20 0a 20 20 20 20  penVirtual .    
179d0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
179e0 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
179f0 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
17a00 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
17a10 6e 56 69 72 74 75 61 6c 0a 20 20 20 20 2a 2a 20  nVirtual.    ** 
17a20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
17a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17a40 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
17a50 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
17a60 29 7b 0a 20 20 20 20 20 20 75 6e 63 72 65 61 74  ){.      uncreat
17a70 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  eSortingIndex(pP
17a80 61 72 73 65 2c 20 61 64 64 72 53 6f 72 74 49 6e  arse, addrSortIn
17a90 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  dex);.      p->a
17aa0 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d  ddrOpenVirt[2] =
17ab0 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
17ac0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
17ad0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20  ard inner loop. 
17ae0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 65     */.    if( se
17af0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
17b00 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
17b10 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
17b20 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
17b30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17b40 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
17b50 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
17b60 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
17b70 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67  aff) ){.       g
17b80 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17b90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
17ba0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
17bb0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
17bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
17bd0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
17be0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
17bf0 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73  is is the proces
17c00 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
17c10 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
17c20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
17c30 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
17c40 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
17c50 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
17c60 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
17c70 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
17c80 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
17c90 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
17ca0 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
17cb0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
17cc0 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
17cd0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
17ce0 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
17cf0 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
17d00 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
17d10 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
17d20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
17d30 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
17d40 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
17d70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
17d80 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
17d90 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
17dc0 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
17dd0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
17de0 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
17df0 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
17e00 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
17e10 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
17e20 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
17e30 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
17e40 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
17e50 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54  er */...    /* T
17e60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
17e70 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72  iables hold addr
17e80 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20  esses or labels 
17e90 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68 65  for parts of the
17ea0 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
17eb0 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20  machine program 
17ec0 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20 74  we are putting t
17ed0 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69  ogether */.    i
17ee0 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
17ef0 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  ;      /* Start 
17f00 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
17f10 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
17f20 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ult row */.    i
17f30 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
17f40 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68         /* Set th
17f50 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
17f60 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69   return */.    i
17f70 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  nt addrInitializ
17f80 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20  eLoop; /* Start 
17f90 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69  of code that ini
17fa0 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70  tializes the inp
17fb0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ut loop */.    i
17fc0 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
17fd0 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;      /* Top of
17fe0 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
17ff0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47  */.    int addrG
18000 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f  roupByChange;  /
18010 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73  * Code that runs
18020 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20   when any GROUP 
18030 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20  BY term changes 
18040 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50  */.    int addrP
18050 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f  rocessRow;     /
18060 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73  * Code to proces
18070 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74  s a single input
18080 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
18090 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
180a0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c      /* End of al
180b0 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  l processing */.
180c0 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
180d0 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54  ingIdx;     /* T
180e0 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  he OP_OpenVirtua
180f0 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
18100 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  g index */.    i
18110 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
18120 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75         /* Subrou
18130 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
18140 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
18150 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45  or */..    addrE
18160 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18170 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
18180 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
18190 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
181a0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
181b0 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
181c0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
181d0 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
181e0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
181f0 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
18200 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
18210 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18220 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
18230 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
18240 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
18250 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
18260 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
18270 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
18280 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
18290 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
182a0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
182b0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
182c0 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
182d0 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
182e0 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
182f0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
18300 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18310 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
18320 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
18330 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
18340 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18350 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18360 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
18370 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
18380 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  y) ){.      goto
18390 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
183a0 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69   }.    if( pHavi
183b0 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  ng && sqlite3Exp
183c0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
183d0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
183e0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
183f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
18400 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
18410 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
18420 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
18430 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
18440 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
18450 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
18460 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
18470 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
18480 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
18490 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29  .pExpr->pList) )
184a0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
184b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
184c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
184d0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
184e0 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20 73 65  iled() ) goto se
184f0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
18500 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
18510 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
18520 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
18530 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
18540 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
18550 20 63 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67   complex tha agg
18560 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
18570 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
18580 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
18590 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
185a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
185b0 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
185c0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
185d0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
185e0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  /..      /* Crea
185f0 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77  te labels that w
18600 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e  e will be needin
18610 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
18620 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69  .      addrIniti
18630 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69  alizeLoop = sqli
18640 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18650 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47  (v);.      addrG
18660 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73  roupByChange = s
18670 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18680 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64  bel(v);.      ad
18690 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73  drProcessRow = s
186a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
186b0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  bel(v);..      /
186c0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
186d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
186e0 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  we might need a 
186f0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f  sorting index to
18700 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
18710 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74  ent it.  Allocat
18720 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69  e that sorting i
18730 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74  ndex now.  If it
18740 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20   turns out.     
18750 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
18760 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72  ot need it after
18770 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56 69   all, the OpenVi
18780 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
18790 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
187a0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
187b0 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
187c0 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
187d0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
187e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
187f0 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
18800 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
18810 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
18820 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61  roupBy);.      a
18830 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a  ddrSortingIdx =.
18840 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18850 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
18860 70 65 6e 56 69 72 74 75 61 6c 2c 20 73 41 67 67  penVirtual, sAgg
18870 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
18880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18890 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
188a0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
188b0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
188c0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
188d0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
188e0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
188f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
18900 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
18910 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
18920 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
18930 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
18940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
18950 65 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e  eFlag = pParse->
18960 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41  nMem++;.      iA
18970 62 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73  bortFlag = pPars
18980 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
18990 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
189a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
189b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
189c0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
189d0 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
189e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
189f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
18a00 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
18a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18a20 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
18a30 6d 49 6e 74 2c 20 30 2c 20 69 41 62 6f 72 74 46  mInt, 0, iAbortF
18a40 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
18a50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63  Comment((v, "# c
18a60 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22  lear abort flag"
18a70 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
18a80 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18a90 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 55 73 65  _MemInt, 0, iUse
18aa0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
18ab0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
18ac0 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c  indicate accumul
18ad0 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20  ator empty"));. 
18ae0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18af0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
18b00 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  , 0, addrInitial
18b10 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20 20  izeLoop);..     
18b20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
18b30 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
18b40 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
18b50 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
18b60 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
18b70 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
18b80 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
18b90 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
18ba0 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
18bb0 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
18bc0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
18bd0 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
18be0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
18bf0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
18c00 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
18c10 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
18c20 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
18c30 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
18c40 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
18c50 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
18c60 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
18c70 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
18c80 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
18c90 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
18ca0 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
18cb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
18cc0 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
18cd0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18ce0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
18cf0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18d00 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 41  OP_MemInt, 1, iA
18d10 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
18d20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
18d30 20 22 23 20 73 65 74 20 61 62 6f 72 74 20 66 6c   "# set abort fl
18d40 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
18d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18d60 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30   OP_Return, 0, 0
18d70 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
18d80 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
18d90 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
18da0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
18db0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18dc0 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65 46  _IfMemPos, iUseF
18dd0 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
18de0 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
18df0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
18e00 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
18e10 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
18e20 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
18e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18e40 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
18e50 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c   0);.      final
18e60 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
18e70 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
18e80 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  o);.      if( pH
18e90 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20  aving ){.       
18ea0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
18eb0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
18ec0 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
18ed0 6f 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  ow+1, 1);.      
18ee0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  }.      rc = sel
18ef0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
18f00 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
18f10 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
18f20 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
18f40 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20 69  stinct, eDest, i
18f50 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  Parm, .         
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
18f80 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 2c  1, addrSetAbort,
18f90 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28   aff);.      if(
18fa0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
18fb0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
18fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18fe0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
18ff0 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
19000 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 6e 64  mment((v, "# end
19010 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
19020 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
19030 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
19040 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
19050 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
19060 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
19070 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
19080 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
19090 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
190a0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
190b0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
190c0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
190d0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
190e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
190f0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
19100 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  0);..      /* Be
19110 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
19120 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
19130 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
19140 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
19150 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
19160 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
19170 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
19180 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
19190 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
191a0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
191b0 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
191c0 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
191d0 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
191e0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
191f0 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
19200 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
19210 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
19220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19230 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19240 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
19250 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  op);.      sqlit
19260 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19270 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72  P_Gosub, 0, addr
19280 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
19290 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
192a0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
192b0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
192c0 65 2c 20 26 70 47 72 6f 75 70 42 79 29 3b 0a 20  e, &pGroupBy);. 
192d0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
192e0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
192f0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
19300 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
19310 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
19320 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
19330 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
19340 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
19350 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
19360 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
19370 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
19380 4f 70 65 6e 56 69 72 74 75 61 6c 20 74 61 62 6c  OpenVirtual tabl
19390 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
193a0 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
193b0 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
193c0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
193d0 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
193e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
193f0 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
19400 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  pGroupBy;.      
19410 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
19420 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
19430 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
19440 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
19450 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
19460 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
19470 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
19480 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
19490 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
194a0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
194b0 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
194c0 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
194d0 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
194e0 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
194f0 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
19500 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
19510 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
19520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19530 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
19540 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19550 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
19560 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
19570 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
19580 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19590 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67  OP_Sequence, sAg
195a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
195b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  , 0);.        j 
195c0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
195d0 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  r+1;.        for
195e0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
195f0 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
19600 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
19610 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
19620 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
19630 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
19640 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
19650 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63 6f  terColumn<j ) co
19660 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
19670 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 43 6f 6c    if( pCol->iCol
19680 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  umn<0 ){.       
19690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
196a0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
196b0 64 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  d, pCol->iTable,
196c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
196d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
196e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
196f0 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
19700 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70   pCol->iTable, p
19710 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  Col->iColumn);. 
19720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19730 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
19740 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
19750 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19760 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a  OP_MakeRecord, j
19770 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
19780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19790 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
197a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
197b0 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
197c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
197d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
197e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
197f0 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73  Op(v, OP_Sort, s
19800 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
19810 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
19820 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
19830 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42  t((v, "# GROUP B
19840 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
19850 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
19860 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
19870 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
19880 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
19890 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
198a0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
198b0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
198c0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
198d0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
198e0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
198f0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
19900 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
19910 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
19920 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
19930 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
19940 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
19950 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
19960 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
19970 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
19980 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
19990 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
199a0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
199b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
199c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
199d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
199e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
199f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19a00 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
19a10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19a20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
19a30 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
19a40 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29  o.sortingIdx, j)
19a50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
19a60 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
19a70 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
19a80 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
19a90 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
19aa0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
19ab0 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
19ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
19ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19ae0 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
19af0 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75  iBMem+j, j<pGrou
19b00 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  pBy->nExpr-1);. 
19b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
19b20 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (j=pGroupBy->nEx
19b30 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  pr-1; j>=0; j--)
19b40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  {.        if( j<
19b50 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
19b60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
19b70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19b80 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69  v, OP_MemLoad, i
19b90 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20  BMem+j, 0);.    
19ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
19bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19bc0 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41  , OP_MemLoad, iA
19bd0 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+j, 0);.     
19be0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20     if( j==0 ){. 
19bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19c00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19c10 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50  Eq, 0x200, addrP
19c20 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
19c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19c50 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
19c60 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70  0x200, addrGroup
19c70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
19c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
19c90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
19ca0 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
19cb0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
19cc0 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P3_COLLSEQ);.
19cd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
19ce0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19cf0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
19d00 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
19d10 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
19d20 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20  * Change in the 
19d30 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
19d40 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
19d50 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
19d60 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
19d70 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
19d80 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
19d90 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
19da0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
19db0 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
19dc0 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
19dd0 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
19de0 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
19df0 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
19e00 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
19e10 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
19e20 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
19e30 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
19e40 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
19e50 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
19e60 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
19e70 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
19e80 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
19e90 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
19ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
19eb0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
19ec0 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
19ed0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
19ee0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
19ef0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
19f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f10 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65  Op(v, OP_MemMove
19f20 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d  , iAMem+j, iBMem
19f30 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
19f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19f50 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
19f60 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
19f70 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
19f80 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
19f90 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
19fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19fb0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
19fc0 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  emPos, iAbortFla
19fd0 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
19fe0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19ff0 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72  v, "# check abor
1a000 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
1a010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a020 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
1a030 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
1a040 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a050 28 76 2c 20 22 23 20 72 65 73 65 74 20 61 63 63  (v, "# reset acc
1a060 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
1a070 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1a080 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1a090 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
1a0a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
1a0b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
1a0c0 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
1a0d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1a0e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a0f0 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52  (v, addrProcessR
1a100 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  ow);.      updat
1a110 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1a120 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1a130 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a140 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1a150 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61  mInt, 1, iUseFla
1a160 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1a170 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64  mment((v, "# ind
1a180 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
1a190 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
1a1a0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
1a1b0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
1a1c0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
1a1d0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1a1e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a1f0 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  Op(v, OP_Next, s
1a200 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1a210 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
1a220 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
1a230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a240 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1a250 3b 0a 20 20 20 20 20 20 20 20 75 6e 63 72 65 61  ;.        uncrea
1a260 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
1a270 50 61 72 73 65 2c 20 61 64 64 72 53 6f 72 74 69  Parse, addrSorti
1a280 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
1a290 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
1a2a0 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
1a2b0 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
1a2c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
1a2d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1a2e0 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
1a2f0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
1a300 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a310 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72  # output final r
1a320 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20  ow"));.      .  
1a330 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
1a340 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73  oupBy */.    els
1a350 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  e {.      /* Thi
1a360 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
1a370 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
1a380 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
1a390 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
1a3a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
1a3b0 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
1a3c0 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
1a3d0 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
1a3e0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
1a3f0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1a400 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
1a410 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
1a420 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
1a430 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1a440 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1a450 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1a460 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1a470 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
1a480 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
1a490 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
1a4a0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
1a4b0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
1a4c0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
1a4d0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69  WInfo);.      fi
1a4e0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
1a4f0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
1a500 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72  Info);.      pOr
1a510 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
1a520 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
1a530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a540 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1a550 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
1a560 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  End, 1);.      }
1a570 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
1a580 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
1a590 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20  , p->pEList, 0, 
1a5a0 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20  0, 0, -1, .     
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 61   eDest, iParm, a
1a5d0 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c  ddrEnd, addrEnd,
1a5e0 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20   aff);.    }.   
1a5f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a600 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1a610 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f  End);.    .  } /
1a620 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74  * endif aggregat
1a630 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a  e query */..  /*
1a640 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
1a650 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
1a660 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f   then we need to
1a670 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74   sort the result
1a680 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20  s.  ** and send 
1a690 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c  them to the call
1a6a0 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  back one by one.
1a6b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
1a6c0 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e 65  erBy ){.    gene
1a6d0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
1a6e0 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73  rse, p, v, pELis
1a6f0 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c  t->nExpr, eDest,
1a700 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69   iParm);.  }..#i
1a710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a720 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a 20  T_SUBQUERY.  /* 
1a730 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73 75  If this was a su
1a740 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65 20  bquery, we have 
1a750 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74 68  now converted th
1a760 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1a770 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
1a780 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65   table.  So dele
1a790 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  te the subquery 
1a7a0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
1a7b0 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74  he parent.  ** t
1a7c0 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 73  o prevent this s
1a7d0 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
1a7e0 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
1a7f0 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
1a800 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73 65  the.  ** the use
1a810 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
1a820 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
1a830 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20  if( pParent ){. 
1a840 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1a850 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70  nt->pSrc->nSrc>p
1a860 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20  arentTab );.    
1a870 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1a880 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54  >pSrc->a[parentT
1a890 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29  ab].pSelect==p )
1a8a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1a8b0 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  ectDelete(p);.  
1a8c0 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
1a8d0 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53  >a[parentTab].pS
1a8e0 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23  elect = 0;.  }.#
1a8f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70  endif..  /* Jump
1a900 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
1a910 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
1a920 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1a930 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
1a940 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
1a950 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75  CT was successfu
1a960 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74  lly coded.   Set
1a970 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
1a980 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e   to 0.  ** to in
1a990 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73  dicate no errors
1a9a0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b  ..  */.  rc = 0;
1a9b0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
1a9c0 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
1a9d0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1a9e0 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
1a9f0 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
1aa00 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
1aa10 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
1aa20 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
1aa30 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1aa40 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
1aa50 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f  iteFree(sAggInfo
1aa60 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
1aa70 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.