/ Hex Artifact Content
Login

Artifact 2d6a485a3fcb342e132ca1542556c1afaad56686:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 37 30  select.c,v 1.270
0200: 20 32 30 30 35 2f 30 39 2f 31 39 20 31 35 3a 33   2005/09/19 15:3
0210: 37 3a 30 37 20 64 72 68 20 45 78 70 20 24 0a 2a  7:07 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0820: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
0830: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0840: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
0850: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0860: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20  addrOpenVirt[2] 
0870: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0880: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0890: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
08a0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
08b0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
08c0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
08d0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
08e0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
08f0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0900: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0910: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0920: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0930: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0940: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0950: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0960: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0970: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0980: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0990: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
09a0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
09b0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
09c0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
09d0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
09e0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
09f0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0a00: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0a10: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0a20: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0a30: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0a40: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0a50: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0a60: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a80: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a90: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0aa0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0ab0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0ac0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0ad0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0ae0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0af0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0b00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b10: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0b20: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0b30: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0b40: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0b50: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0b60: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b70: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b80: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b90: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0ba0: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0bb0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0bc0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0bd0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0be0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0bf0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0c00: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0c10: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0c20: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c30: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0c40: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0c50: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0c60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0c70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0c80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0c90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0ca0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0cb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0cc0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0cd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0ce0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
0cf0: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
0d00: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
0d10: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
0d20: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
0d30: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
0d40: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 2d 3e 7a  te3StrNICmp(p->z
0d50: 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b  , keywords[j].zK
0d60: 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30  eyword, p->n)==0
0d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
0d80: 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73  type |= keywords
0d90: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
0da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
0db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
0dc0: 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  >=sizeof(keyword
0dd0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0de0: 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ds[0]) ){.      
0df0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
0e00: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
0e10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
0e20: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
0e30: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
0e40: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
0e50: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
0e60: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
0e70: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
0e80: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
0e90: 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a  ar *zSp1 = " ";.
0ea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0eb0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
0ec0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70  if( pB==0 ){ zSp
0ed0: 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  1++; }.    if( p
0ee0: 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20  C==0 ){ zSp2++; 
0ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
0f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
0f10: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0f20: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0f30: 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25   ".       "%T%s%
0f40: 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31  T%s%T", pA, zSp1
0f50: 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b  , pB, zSp2, pC);
0f60: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
0f70: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
0f80: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
0f90: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
0fa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0fb0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0fc0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0fd0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0fe0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0ff0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1000: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1010: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1020: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1030: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1040: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1050: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1060: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
1070: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
1080: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1090: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
10a0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
10b0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
10c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
10d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
10e0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
10f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1100: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1110: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1120: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1130: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1140: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1150: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1160: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
1170: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
1180: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
1190: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
11a0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
11b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
11c0: 20 70 2d 3e 7a 20 3d 20 7a 3b 0a 20 20 70 2d 3e   p->z = z;.  p->
11d0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
11e0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
11f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20  /*.** Create an 
1200: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1210: 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  for an identifie
1220: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
1230: 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74  of zName.*/.stat
1240: 69 63 20 45 78 70 72 20 2a 63 72 65 61 74 65 49  ic Expr *createI
1250: 64 45 78 70 72 28 63 6f 6e 73 74 20 63 68 61 72  dExpr(const char
1260: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
1270: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
1280: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
1290: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
12a0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12b0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d  0, 0, &dummy);.}
12c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  .../*.** Add a t
12d0: 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45  erm to the WHERE
12e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a   expression in *
12f0: 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75  ppExpr that requ
1300: 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c  ires the.** zCol
1310: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71   column to be eq
1320: 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74  ual in the two t
1330: 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20  ables pTab1 and 
1340: 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  pTab2..*/.static
1350: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1360: 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rm(.  const char
1370: 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f   *zCol,        /
1380: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1390: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
13a0: 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20  Table *pTab1,   
13b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c     /* First tabl
13c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13d0: 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20  r *zAlias1,     
13e0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72  /* Alias for fir
13f0: 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  st table.  May b
1400: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  e NULL */.  cons
1410: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20  t Table *pTab2, 
1420: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74       /* Second t
1430: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1440: 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20  char *zAlias2,  
1450: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1460: 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d  second table.  M
1470: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1480: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
1490: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
14a0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
14b0: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
14c0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
14d0: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
14e0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
14f0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
1500: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
1510: 20 20 70 45 31 61 20 3d 20 63 72 65 61 74 65 49    pE1a = createI
1520: 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 70  dExpr(zCol);.  p
1530: 45 32 61 20 3d 20 63 72 65 61 74 65 49 64 45 78  E2a = createIdEx
1540: 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  pr(zCol);.  if( 
1550: 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20  zAlias1==0 ){.  
1560: 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62    zAlias1 = pTab
1570: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  1->zName;.  }.  
1580: 70 45 31 62 20 3d 20 63 72 65 61 74 65 49 64 45  pE1b = createIdE
1590: 78 70 72 28 7a 41 6c 69 61 73 31 29 3b 0a 20 20  xpr(zAlias1);.  
15a0: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
15b0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
15c0: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
15d0: 7d 0a 20 20 70 45 32 62 20 3d 20 63 72 65 61 74  }.  pE2b = creat
15e0: 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 32 29  eIdExpr(zAlias2)
15f0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
1600: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
1610: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1620: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1630: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62  xpr(TK_DOT, pE2b
1640: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1650: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1660: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
1670: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
1680: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1690: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a 70 70 45  romJoin);.  *ppE
16a0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
16b0: 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20 70 45  rAnd(*ppExpr, pE
16c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
16d0: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
16e0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
16f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1700: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1710: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
1720: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
1730: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
1740: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1750: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
1760: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
1770: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
1780: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
1790: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
17a0: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
17b0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
17c0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
17d0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
17e0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
17f0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
1800: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
1810: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
1820: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
1830: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
1840: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
1850: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
1860: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1870: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
1880: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
1890: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
18a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
18b0: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
18c0: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  p){.  while( p )
18d0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
18e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
18f0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65 74 4a 6f  Join);.    setJo
1900: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  inExpr(p->pLeft)
1910: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
1920: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
1930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1940: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
1950: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
1960: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
1970: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
1980: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
1990: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
19a0: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
19b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19c0: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
19d0: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
19e0: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
19f0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
1a00: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
1a10: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
1a20: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1a30: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
1a40: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
1a50: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
1a60: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a70: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
1a80: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
1a90: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
1aa0: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
1ab0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1ac0: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
1ad0: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
1ae0: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
1af0: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
1b00: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
1b10: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
1b20: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
1b30: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
1b40: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
1b50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b60: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
1b70: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
1b80: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
1b90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ba0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1bb0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1bc0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
1bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1be0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
1bf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1c00: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
1c10: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1c30: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
1c40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1c50: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1c80: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1c90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
1ca0: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
1cb0: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
1cc0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
1cd0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
1ce0: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
1cf0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
1d00: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
1d10: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
1d20: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
1d30: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
1d40: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
1d50: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
1d60: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
1d70: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
1d80: 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20  ble *pLeftTab = 
1d90: 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20  pLeft->pTab;.   
1da0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
1db0: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
1dc0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ;..    if( pLeft
1dd0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
1de0: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
1df0: 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  e;..    /* When 
1e00: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
1e10: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
1e20: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
1e30: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
1e40: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
1e50: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
1e60: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
1e70: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1e80: 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70  ( pLeft->jointyp
1e90: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
1ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  {.      if( pLef
1eb0: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66 74 2d  t->pOn || pLeft-
1ec0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
1ed0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ee0: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
1ef0: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
1f00: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
1f10: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
1f20: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
1f30: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f50: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65    for(j=0; j<pLe
1f60: 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ftTab->nCol; j++
1f70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1f80: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61  *zName = pLeftTa
1f90: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1fa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1fb0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
1fc0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
1fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
1fe0: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
1ff0: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2000: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2030: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2040: 73 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  s, &p->pWhere);.
2050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2060: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2070: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2080: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2090: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
20a0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
20b0: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26 26  f( pLeft->pOn &&
20c0: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
20d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20f0: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2100: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2110: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2120: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2130: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2140: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2150: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2160: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2170: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2180: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2190: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
21a0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
21b0: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
21c0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  >pOn ){.      se
21d0: 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74 2d  tJoinExpr(pLeft-
21e0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  >pOn);.      p->
21f0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2200: 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72  ExprAnd(p->pWher
2210: 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a  e, pLeft->pOn);.
2220: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 4f 6e        pLeft->pOn
2230: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2240: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
2250: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
2260: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
2270: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
2280: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
2290: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
22a0: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
22b0: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
22c0: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
22d0: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
22e0: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
22f0: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
2300: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
2310: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
2320: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
2330: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
2340: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
2350: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
2360: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
2370: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
2380: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2390: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
23a0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
23b0: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
23c0: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
23d0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 55 73    if( pLeft->pUs
23e0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
23f0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 4c 65  ist *pList = pLe
2400: 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ft->pUsing;.    
2410: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
2420: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
2430: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2440: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
2450: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2460: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2470: 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29  pLeftTab, zName)
2480: 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65  <0 || columnInde
2490: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
24a0: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
24b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24c0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
24d0: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
24e0: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
24f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
2500: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2510: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61  oth tables", zNa
2520: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  me);.          r
2530: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2540: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
2550: 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70  ereTerm(zName, p
2560: 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e  LeftTab, pLeft->
2570: 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20  zAlias, .       
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
25a0: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 20  pRight->zAlias, 
25b0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
25c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
25e0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
25f0: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
2600: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
2610: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
2620: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2630: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2640: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2650: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2660: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2670: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69  stDelete(p->pELi
2680: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
2690: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  cListDelete(p->p
26a0: 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Src);.  sqlite3E
26b0: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68  xprDelete(p->pWh
26c0: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
26d0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
26e0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
26f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2700: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
2710: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2720: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2740: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2750: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
2760: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
2770: 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  it);.  sqlite3Ex
2780: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f 66 66  prDelete(p->pOff
2790: 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  set);.  sqliteFr
27a0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
27b0: 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f  Insert code into
27c0: 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70   "v" that will p
27d0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f  ush the record o
27e0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
27f0: 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74  .** stack into t
2800: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
2810: 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e  atic void pushOn
2820: 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a  toSorter(Parse *
2830: 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c  pParse, Vdbe *v,
2840: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2850: 72 42 79 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  rBy){.  sqlite3E
2860: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2870: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75  AddOp(v, OP_Sequ
28a0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
28b0: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
28c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28d0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72  (v, OP_Pull, pOr
28e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
28f0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
2900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2910: 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65  akeRecord, pOrde
2920: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20  rBy->nExpr + 2, 
2930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2940: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
2950: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
2960: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
2970: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
2980: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2990: 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49  he OFFSET and LI
29a0: 4d 49 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  MIT.*/.static vo
29b0: 69 64 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a  id codeLimiter(.
29c0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
29d0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
29e0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
29f0: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
2a00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2a10: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a20: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
2a30: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
2a40: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
2a50: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
2a60: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rent record */. 
2a70: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
2a80: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2a90: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
2aa0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20  */.  int nPop   
2ab0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ac0: 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70   of times to pop
2ad0: 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70   stack when jump
2ae0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
2af0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26  p->iOffset>=0 &&
2b00: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b   iContinue!=0 ){
2b10: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20  .    int addr = 
2b20: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2b30: 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
2b40: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20     if( nPop>0 ) 
2b50: 61 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  addr++;.    sqli
2b60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2b70: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
2b80: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
2b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ba0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
2bb0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
2bc0: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70  r);.    if( nPop
2bd0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
2be0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2bf0: 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29  OP_Pop, nPop, 0)
2c00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2c20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2c30: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
2c40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
2c50: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
2c60: 64 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ds"));.  }.  if(
2c70: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26   p->iLimit>=0 &&
2c80: 20 69 42 72 65 61 6b 21 3d 30 20 29 7b 0a 20 20   iBreak!=0 ){.  
2c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ca0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2cb0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
2cc0: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
2cd0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 78 69  mment((v, "# exi
2ce0: 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 72 65 61  t when LIMIT rea
2cf0: 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  ched"));.  }.}..
2d00: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
2d10: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
2d20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
2d30: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f  top N elements o
2d40: 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61  f the.** stack a
2d50: 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54  re distinct.  iT
2d60: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
2d70: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
2d80: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
2d90: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
2da0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
2db0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
2dc0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
2dd0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
2de0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
2df0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
2e00: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
2e10: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4b 20   made and the K 
2e20: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
2e30: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
2e40: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
2e50: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
2e60: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
2e70: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
2e80: 69 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20  istinct(.  Vdbe 
2e90: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *v,           /*
2ea0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
2eb0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
2ec0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
2ed0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
2ee0: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
2ef0: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
2f00: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
2f10: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
2f20: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
2f30: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
2f40: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2f50: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20       /* The top 
2f60: 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  N elements of th
2f70: 65 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20  e stack must be 
2f80: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
2f90: 74 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  t K             
2fa0: 20 2f 2a 20 50 6f 70 20 4b 20 65 6c 65 6d 65 6e   /* Pop K elemen
2fb0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ts from the stac
2fc0: 6b 20 69 66 20 69 6e 64 69 73 74 69 6e 63 74 20  k if indistinct 
2fd0: 2a 2f 0a 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  */.){.#if NULL_A
2fe0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
2ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3000: 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  p(v, OP_IsNull, 
3010: 2d 4e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -N, sqlite3VdbeC
3020: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 36 29  urrentAddr(v)+6)
3030: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
3040: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3050: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e  P_MakeRecord, -N
3060: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
3080: 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73  istinct, iTab, s
3090: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
30a0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73  tAddr(v)+3);.  s
30b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
30c0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30 29  v, OP_Pop, K, 0)
30d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
30e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
30f0: 20 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b   0, addrRepeat);
3100: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
3110: 76 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73  v, "# skip indis
3120: 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29  tinct records"))
3130: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3140: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
3150: 73 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a  sert, iTab, 0);.
3160: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
3170: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
3180: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
3190: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
31a0: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
31b0: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
31c0: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
31d0: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
31e0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
31f0: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
3200: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
3210: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
3220: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
3230: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
3240: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
3250: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
3260: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
3270: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
3280: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
3290: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
32a0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
32b0: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
32c0: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
32d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
32e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
32f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3300: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
3310: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3320: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
3330: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3340: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
3350: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
3360: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
3370: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
3380: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
3390: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
33a0: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
33b0: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
33c0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
33d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
33e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
33f0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
3400: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
3410: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3420: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
3430: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
3440: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
3450: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
3460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
3470: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
3480: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
3490: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  nct */.  int eDe
34a0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
34b0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
34c0: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
34d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
34e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
34f0: 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  * An argument to
3500: 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65   the disposal me
3510: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  thod */.  int iC
3520: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
3530: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3540: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
3550: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
3560: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
3570: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
3580: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
3590: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
35a0: 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  p */.  char *aff
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35c0: 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * affinity strin
35d0: 67 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52  g if eDest is SR
35e0: 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  T_Union */.){.  
35f0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3600: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
3610: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
3620: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
3630: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
3640: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
3650: 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28  resent */..  if(
3660: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
3670: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
3680: 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  st!=0 );..  /* I
3690: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49  f there was a LI
36a0: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  MIT clause on th
36b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
36c0: 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  nt, then do the 
36d0: 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  check.  ** to se
36e0: 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68  e if this row sh
36f0: 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a  ould be output..
3700: 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e    */.  hasDistin
3710: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
3720: 20 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45   && pEList && pE
3730: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20  List->nExpr>0;. 
3740: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
3750: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
3760: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4c 69 6d 69   ){.    codeLimi
3770: 74 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  ter(v, p, iConti
3780: 6e 75 65 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  nue, iBreak, 0);
3790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
37a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
37b0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
37c0: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
37d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
37e0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
37f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3800: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
3810: 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20  , srcTab, i);.  
3820: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
3830: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
3840: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71  t->nExpr;.    sq
3850: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
3860: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
3870: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
3880: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
3890: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
38a0: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
38b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
38c0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
38d0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
38e0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
38f0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
3900: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
3910: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
3920: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
3930: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
3940: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
3950: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c   codeDistinct(v,
3960: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
3970: 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31 29 3b 0a 20  inue, n, n+1);. 
3980: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d     if( pOrderBy=
3990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
39a0: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
39b0: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
39c0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
39d0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
39e0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
39f0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
3a00: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
3a10: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
3a20: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
3a30: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
3a40: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
3a50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3a60: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
3a70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
3a80: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ion: {.      sql
3a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3aa0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3ab0: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3ac0: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
3ad0: 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29 7b        if( aff ){
3ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3af0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3b00: 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54  -1, aff, P3_STAT
3b10: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
3b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3b30: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
3b40: 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ert, iParm, 0);.
3b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
3b70: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
3b80: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
3b90: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
3ba0: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
3bb0: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
3bc0: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
3bd0: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
3be0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
3bf0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
3c00: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3c10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
3c20: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ept: {.      int
3c30: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
3c40: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3c50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3c60: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3c70: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
3c80: 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  INCT);.      sql
3c90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
3ca0: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
3cb0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
3cc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3cd0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
3ce0: 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a  iParm, addr+3);.
3cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
3d10: 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ete, iParm, 0);.
3d20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
3d40: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
3d50: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
3d60: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
3d70: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3d80: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
3d90: 73 65 20 53 52 54 5f 56 69 72 74 75 61 6c 54 61  se SRT_VirtualTa
3da0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
3db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3dc0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3dd0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3de0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3df0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3e00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3e10: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3e20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3e40: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
3e50: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
3e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3e80: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
3e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ea0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  dOp(v, OP_Insert
3eb0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
3ec0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3ed0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
3ee0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3ef0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
3f00: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
3f10: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
3f20: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
3f30: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
3f40: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
3f50: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
3f60: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
3f70: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
3f80: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
3f90: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
3fa0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
3fb0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
3fc0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
3fd0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
3fe0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3ff0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
4000: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
4010: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4020: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4040: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
4050: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
4060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4070: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
4080: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
4090: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
40a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
40b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
40c0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
40d0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
40e0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
40f0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
4100: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
4110: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
4120: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
4130: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
4140: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
4150: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
4160: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
4170: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
4180: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
4190: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
41a0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
41b0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
41c0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
41d0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
41e0: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
41f0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
4210: 61 72 20 61 66 66 20 3d 20 28 69 50 61 72 6d 3e  ar aff = (iParm>
4220: 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20  >16)&0xFF;.     
4230: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
4240: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
4250: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
4260: 70 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20  pr, aff);.      
4270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4280: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4290: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 2c 20 31  d, 1, 0, &aff, 1
42a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
42b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
42c0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50  P_IdxInsert, (iP
42d0: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
42e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
42f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4300: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c  angeP2(v, addr2,
4310: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4320: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
4330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4340: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
4350: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
4360: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
4370: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4380: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
4390: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
43a0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
43b0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
43c0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
43d0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
43e0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
43f0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
4400: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  :.    case SRT_M
4410: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4420: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4430: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4440: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4450: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4460: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
4470: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
4480: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4490: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
44a0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
44b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
44c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
44d0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
44e0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  reak);.      }. 
44f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4500: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
4510: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4520: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
4530: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
4540: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
4550: 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f  k function or to
4560: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20   a subroutine.  
4570: 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  In the.    ** ca
4580: 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  se of a subrouti
4590: 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ne, the subrouti
45a0: 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73  ne itself is res
45b0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20  ponsible for.   
45c0: 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20   ** popping the 
45d0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74  data from the st
45e0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
45f0: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
4600: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
4610: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
4620: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4630: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4640: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4650: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
4660: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4670: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4680: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4690: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
46a0: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
46b0: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
46c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
46d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
46e0: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
46f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4720: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
4730: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4750: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
4770: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
4780: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
4790: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
47a0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
47b0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
47c0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
47d0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
47e0: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
47f0: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
4800: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
4810: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
4820: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
4830: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
4840: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
4850: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
4860: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
4870: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
4880: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4890: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
48a0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
48b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
48c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
48d0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
48e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
4900: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4910: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
4920: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
4930: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
4940: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
4950: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
4960: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4970: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
4980: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
4990: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
49a0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
49b0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
49c0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
49d0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
49e0: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
49f0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
4a00: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
4a10: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
4a20: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
4a30: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
4a40: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
4a50: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
4a60: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
4a70: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
4a80: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
4a90: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
4aa0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
4ab0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
4ac0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
4ad0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
4ae0: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
4af0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
4b00: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4b10: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
4b20: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
4b30: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
4b40: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
4b50: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
4b60: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
4b70: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
4b80: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
4b90: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
4ba0: 72 65 20 74 6f 20 74 68 65 20 50 33 20 66 69 65  re to the P3 fie
4bb0: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
4bc0: 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59 49  using.** P3_KEYI
4bd0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
4be0: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
4bf0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
4c00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
4c10: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
4c20: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
4c30: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
4c40: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
4c50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4c60: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
4c70: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
4c80: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
4c90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
4ca0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
4cb0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
4cc0: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
4cd0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
4ce0: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
4cf0: 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
4d00: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
4d10: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
4d20: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4d30: 65 72 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  er = (char*)&pIn
4d40: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
4d50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
4d60: 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
4d70: 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64 62   pInfo->enc = db
4d80: 2d 3e 65 6e 63 3b 0a 20 20 20 20 66 6f 72 28 69  ->enc;.    for(i
4d90: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
4da0: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
4db0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
4dc0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
4dd0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
4de0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4df0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
4e00: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
4e10: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
4e20: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
4e30: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
4e40: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
4e50: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
4e60: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
4e70: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
4e80: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
4e90: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
4ea0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
4eb0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
4ec0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
4ed0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
4ee0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
4ef0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
4f00: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
4f10: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
4f20: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
4f30: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
4f40: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
4f50: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
4f60: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
4f70: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
4f80: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
4f90: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
4fa0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
4fb0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
4fc0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
4fd0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
4fe0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
4ff0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
5000: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
5010: 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  t *p,       /* T
5020: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5030: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
5040: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ,         /* Gen
5050: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
5060: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
5070: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
5090: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
50a0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
50b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
50c0: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
50d0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ere */.  int iPa
50e0: 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  rm        /* Opt
50f0: 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  ional parameter 
5100: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5110: 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eDest */.){.  in
5120: 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  t brk = sqlite3V
5130: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5140: 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71  .  int cont = sq
5150: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5160: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
5170: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
5180: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
5190: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
51a0: 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  y;..  iTab = pOr
51b0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
51c0: 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71  .  addr = 1 + sq
51d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
51e0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
51f0: 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4c 69 6d   brk);.  codeLim
5200: 69 74 65 72 28 76 2c 20 70 2c 20 63 6f 6e 74 2c  iter(v, p, cont,
5210: 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69   brk, 0);.  sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5230: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
5240: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
5250: 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28   + 1);.  switch(
5260: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
5270: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5280: 20 20 63 61 73 65 20 53 52 54 5f 56 69 72 74 75    case SRT_Virtu
5290: 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  alTab: {.      s
52a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
52b0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
52c0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
52d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52e0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
52f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5300: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5310: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5320: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
5330: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
5340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5350: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
5360: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
5370: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5380: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5390: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
53a0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
53b0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
53c0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
53d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
53e0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
53f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5400: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5410: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
5420: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
5430: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
5440: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
5450: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5460: 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53   1, 0, "n", P3_S
5470: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
5480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5490: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
54a0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
54b0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  F), 0);.      br
54c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
54d0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 0a  ase SRT_Exists:.
54e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
54f0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5500: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5520: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
5530: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
5540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5560: 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20  oto, 0, brk);.  
5570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5580: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
5590: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20   SRT_Callback:. 
55a0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
55b0: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
55c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
55d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
55e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
55f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
5600: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5610: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5620: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
5630: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
5640: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
5650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5660: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
5670: 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20  mn, -1-i, i);.  
5680: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5690: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
56a0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
56b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
56c0: 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
56d0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
56e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5700: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
5710: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
5720: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5730: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5740: 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  Pop, 2, 0);.    
5750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5760: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5770: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
5780: 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
5790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
57a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
57b0: 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
57c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
57d0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
57e0: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
57f0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
5800: 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 7d  Label(v, brk);.}
5810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
5820: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
5830: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
5840: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
5850: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
5860: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
5870: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
5880: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
5890: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
58a0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ller..**.** If t
58b0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
58c0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
58d0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
58e0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
58f0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69  rom.** the origi
5900: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
5910: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
5920: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5930: 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a  a column..** .**
5940: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
5950: 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70   type for an exp
5960: 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65  ression is eithe
5970: 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43 20  r TEXT, NUMERIC 
5980: 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20 64  or ANY..** The d
5990: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
59a0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
59b0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f  d is INTEGER..*/
59c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
59d0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 4e  ar *columnType(N
59e0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
59f0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
5a00: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
5a10: 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  pe;.  int j;.  i
5a20: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
5a30: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
5a40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
5a50: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
5a60: 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  ator can only oc
5a70: 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59 2c  cur in ORDER BY,
5a80: 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49 4e   GROUP BY, HAVIN
5a90: 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49  G,.  ** and LIMI
5aa0: 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74 20  T clauses.  But 
5ab0: 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65 73  pExpr originates
5ac0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5ad0: 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c  et of a.  ** SEL
5ae0: 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20 63  ECT.  So pExpr c
5af0: 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  an never contain
5b00: 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72 2e   an AS operator.
5b10: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
5b20: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53  pExpr->op!=TK_AS
5b30: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
5b40: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
5b50: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
5b60: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
5b70: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Tab = 0;.      i
5b80: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
5b90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
5ba0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
5bb0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
5bc0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5bd0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
5be0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
5bf0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
5c00: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
5c10: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
5c20: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
5c30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
5c40: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
5c50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
5c60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
5c70: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
5c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5c90: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
5ca0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
5cb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5cc0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
5cd0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20    /* FIX ME:.   
5ce0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e       ** This can
5cf0: 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68   occurs if you h
5d00: 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  ave something li
5d10: 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  ke "SELECT new.x
5d20: 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20  ;" inside.      
5d30: 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20    ** a trigger. 
5d40: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
5d50: 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63   if you referenc
5d60: 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e  e the special "n
5d70: 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ew".        ** t
5d80: 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75  able in the resu
5d90: 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65  lt set of a sele
5da0: 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68  ct.  We do not h
5db0: 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20  ave a good way. 
5dc0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e         ** to fin
5dd0: 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62  d the actual tab
5de0: 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c  le type, so call
5df0: 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69   it "TEXT".  Thi
5e00: 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20  s is really.    
5e10: 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67      ** something
5e20: 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49   of a bug, but I
5e30: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
5e40: 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
5e50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
5e60: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73  * This code does
5e70: 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65   not produce the
5e80: 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
5e90: 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e  - it just preven
5ea0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ts.        ** a 
5eb0: 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74  segfault.  See t
5ec0: 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20  icket #1229..   
5ed0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
5ee0: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
5ef0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
5f10: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
5f20: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
5f30: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
5f40: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
5f50: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
5f60: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5f70: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
5f80: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5f90: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5fa0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
5fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5fc0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
5fd0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
5fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6010: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6020: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
6030: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
6040: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
6050: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
6060: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
6070: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
6080: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
6090: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
60a0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
60b0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
60c0: 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e 70  Type(&sNC, pS->p
60d0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
60e0: 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  r); .      break
60f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6100: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
6110: 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 7d    zType = 0;.  }
6120: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54 79  .  .  return zTy
6130: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
6140: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
6150: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
6160: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
6170: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
6180: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
6190: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
61a0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
61b0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
61c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
61d0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
61e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
61f0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
6200: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
6210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6220: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
6230: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
6240: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
6250: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
6260: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
6280: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
6290: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
62a0: 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  TabList;.  for(i
62b0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
62c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
62d0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
62e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
62f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
6300: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
6310: 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69 66  &sNC, p);.    if
6320: 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e  ( zType==0 ) con
6330: 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68  tinue;.    /* Th
6340: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
6350: 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f   it's own copy o
6360: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
6370: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a  e, in case the .
6380: 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73      ** schema is
6390: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
63a0: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
63b0: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
63c0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
63d0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
63e0: 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  v, i+pEList->nEx
63f0: 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65  pr, zType, strle
6400: 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d  n(zType));.  }.}
6410: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6420: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6430: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
6440: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
6450: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
6460: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
6470: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
6480: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
6490: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
64a0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
64b0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
64c0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
64d0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
64e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
64f0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
6500: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
6510: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
6520: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
6530: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6540: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
6550: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
6560: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
6570: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6580: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
6590: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
65a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
65b0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
65c0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
65d0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
65e0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
65f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
6600: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
6610: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
6620: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
6630: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
6640: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6650: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
6670: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
6680: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  0 || sqlite3_mal
6690: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
66a0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
66b0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
66c0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
66d0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
66e0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
66f0: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
6700: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6710: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
6720: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
6730: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
6740: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
6750: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
6760: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
6770: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
6780: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
6790: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
67a0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
67b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
67c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
67d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
67e0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
67f0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
6800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6810: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
6820: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
6830: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
6840: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6850: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
6860: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
6870: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
6880: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
6890: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
68a0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
68b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
68c0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
68d0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
68e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
68f0: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
6900: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
6910: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
6920: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
6930: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6940: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
6950: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
6960: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
6970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
6980: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
6990: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
69a0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
69b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
69c0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
69d0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
69e0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
69f0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
6a00: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
6a10: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
6a20: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
6a30: 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e  Names && p->span
6a40: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
6a50: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
6a60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6a70: 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61  ame(v, i, p->spa
6a80: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
6a90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6aa0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21   fullNames || (!
6ab0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54  shortNames && pT
6ac0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
6ad0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6ae0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
6af0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
6b00: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
6b10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6b20: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
6b30: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
6b40: 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20   zTab==0 ) zTab 
6b50: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6b70: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
6b80: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
6b90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
6ba0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6bb0: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
6bc0: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
6bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6bf0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43  ColName(v, i, zC
6c00: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
6c10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6c20: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
6c30: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
6c40: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
6c50: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6c60: 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e  e(v, i, p->span.
6c70: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
6c80: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
6c90: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
6ca0: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
6cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6cc0: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
6cd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6ce0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
6cf0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
6d00: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e        sprintf(zN
6d10: 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  ame, "column%d",
6d20: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
6d30: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6d40: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
6d50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
6d60: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
6d70: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
6d80: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
6d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6da0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
6db0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
6dc0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
6dd0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
6de0: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
6df0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
6e10: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
6e20: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
6e30: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
6e40: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
6e50: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
6e60: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
6e70: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
6e80: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
6e90: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
6ea0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
6eb0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
6ec0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
6ed0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
6ee0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6ef0: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
6f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
6f10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6f20: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6f30: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
6f40: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
6f50: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
6f60: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
6f70: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
6f80: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
6f90: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
6fa0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
6fb0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
6fc0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
6fd0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
6fe0: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
6ff0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
7000: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
7010: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
7020: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
7030: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
7040: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
7050: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
7060: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
7070: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
7080: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20  aCol, *pCol;..  
7090: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
70a0: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
70b0: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
70c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
70d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
70e0: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  lve(pParse, pSel
70f0: 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  ect, 0) ){.    r
7100: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7110: 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Tab = sqliteMall
7120: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
7130: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
7140: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7150: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
7160: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7170: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
7180: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
7190: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
71a0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
71b0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
71c0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
71d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
71e0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
71f0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
7200: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
7210: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7220: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
7230: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
7240: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
7250: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
7260: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
7270: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
7280: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
7290: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
72a0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61  e;.    char *zBa
72b0: 73 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  sename;.    int 
72c0: 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  cnt;.    NameCon
72d0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20  text sNC;.    . 
72e0: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
72f0: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
7300: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
7310: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69   */.    p = pELi
7320: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7330: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
7340: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Right==0 || p->p
7350: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  Right->token.z==
7360: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
7370: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b  token.z[0]!=0 );
7380: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
7390: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
73a0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
73b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
73c0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
73d0: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
73e0: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
73f0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
7400: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7410: 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a  eStrDup(zName);.
7420: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
7430: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
7440: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
7450: 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20  R=p->pRight)!=0 
7460: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  && pR->token.z &
7470: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pR->token.z[0]
7480: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
7490: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
74a0: 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61  from A.B use B a
74b0: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
74c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
74d0: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c  te3MPrintf("%T",
74e0: 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pR->token);.  
74f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
7500: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
7510: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
7520: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
7530: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
7540: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
7550: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
7560: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
7570: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54  lite3MPrintf("%T
7580: 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20  ", &p->span);.  
7590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
75a0: 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61  * If all else fa
75b0: 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e  ils, make up a n
75c0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
75d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
75e0: 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  ntf("column%d", 
75f0: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i+1);.    }.    
7600: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
7610: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
7620: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
7630: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
7640: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
7650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
7660: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
7670: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
7680: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7690: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
76a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
76b0: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
76c0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
76d0: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
76e0: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
76f0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
7700: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
7710: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 42 61  ..    */.    zBa
7720: 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  sename = zName;.
7730: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
7740: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
7750: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7760: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
7770: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
7780: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
7790: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
77a0: 22 25 73 3a 25 64 22 2c 20 7a 42 61 73 65 6e 61  "%s:%d", zBasena
77b0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
77c0: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
77d0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
77e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
77f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7800: 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65  zBasename!=zName
7810: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7820: 46 72 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b  Free(zBasename);
7830: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
7840: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
7850: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
7860: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
7870: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
7880: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7890: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
78a0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
78b0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
78c0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
78d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
78e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
78f0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
7900: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d  liteStrDup(colum
7910: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 29 29 3b  nType(&sNC, p));
7920: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
7930: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
7940: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
7950: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
7960: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  ty(p);.    pCol-
7970: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
7980: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
7990: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
79a0: 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b 0a  !pCol->pColl ){.
79b0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c        pCol->pCol
79c0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
79d0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
79e0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
79f0: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
7a00: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
7a10: 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43   Prepare a SELEC
7a20: 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
7a30: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f  processing by do
7a40: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
7a50: 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a  g.** things:.**.
7a60: 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
7a70: 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
7a80: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
7a90: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
7aa0: 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
7ab0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
7ac0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
7ad0: 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
7ae0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
7af0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
7b00: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
7b10: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
7b20: 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
7b30: 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
7b40: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
7b50: 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
7b60: 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
7b70: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
7b80: 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
7b90: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7ba0: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
7bb0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
7bc0: 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
7bd0: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
7be0: 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
7bf0: 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
7c00: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
7c10: 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
7c20: 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
7c30: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
7c40: 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
7c50: 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
7c60: 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
7c70: 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
7c80: 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
7c90: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
7ca0: 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
7cb0: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
7cc0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
7cd0: 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
7ce0: 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
7cf0: 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
7d00: 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
7d10: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
7d20: 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
7d30: 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
7d40: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
7d50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
7d60: 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
7d70: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
7d80: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
7d90: 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
7da0: 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
7db0: 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
7dc0: 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
7dd0: 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
7de0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
7df0: 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
7e00: 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
7e10: 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
7e20: 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
7e30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
7e40: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
7e50: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
7e60: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
7e70: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
7e80: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
7e90: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
7ea0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
7eb0: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20  electStmt(Parse 
7ec0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
7ed0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
7ee0: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
7ef0: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
7f00: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7f10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
7f20: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7f30: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
7f40: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
7f50: 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  pSrc==0 || sqlit
7f60: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
7f70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
7f80: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
7f90: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
7fa0: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
7fb0: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
7fc0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
7fd0: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
7fe0: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
7ff0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
8000: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
8010: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
8020: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
8030: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
8040: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
8050: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
8060: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
8070: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8080: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
8090: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
80a0: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
80b0: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
80c0: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
80d0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
80e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
80f0: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
8100: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
8110: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
8120: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
8130: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
8140: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
8150: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
8160: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
8170: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
8180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
8190: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
81a0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
81b0: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
81c0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
81d0: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
81e0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
81f0: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
8200: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
8210: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
8220: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
8230: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8240: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
8250: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
8260: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
8270: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
8280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8290: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
82a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
82b0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29  rom->zAlias==0 )
82c0: 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  {.        pFrom-
82d0: 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20  >zAlias =.      
82e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
82f0: 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75  tf("sqlite_subqu
8300: 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
8310: 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29  )pFrom->pSelect)
8320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8330: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
8340: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
8350: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
8360: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
8370: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8380: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
8390: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46  From->zAlias, pF
83a0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
83b0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
83c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
83d0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
83e0: 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61      /* The isTra
83f0: 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69  nsient flag indi
8400: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
8410: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
8420: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
8430: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
8440: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
8450: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
8460: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
8470: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
8480: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
8490: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
84a0: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
84b0: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
84c0: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
84d0: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
84e0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54  .      pTab->isT
84f0: 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65  ransient = 1;.#e
8500: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
8510: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
8520: 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
8530: 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
8540: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
8550: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
8560: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
8570: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
8580: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
8590: 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54    sqlite3LocateT
85a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f  able(pParse,pFro
85b0: 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e  m->zName,pFrom->
85c0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
85d0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
85e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
85f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
8600: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
8610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8620: 49 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66  IT_VIEW.      if
8630: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
8640: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
8650: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
8660: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
8670: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
8680: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
8690: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
86a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
86b0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
86c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
86d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86e0: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
86f0: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
8700: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
8710: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
8720: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
8730: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
8740: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
8750: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
8760: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
8770: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
8780: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
8790: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
87a0: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
87b0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
87c0: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
87d0: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
87e0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
87f0: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
8800: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
8810: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
8820: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
8830: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
8840: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
8850: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
8860: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
8870: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
8880: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
8890: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
88a0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
88b0: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
88c0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
88d0: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
88e0: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
88f0: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
8900: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
8910: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
8920: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
8930: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
8940: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
8950: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
8960: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
8970: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
8980: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
8990: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
89a0: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
89b0: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
89c0: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
89d0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
89e0: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
89f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
8a00: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
8a10: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
8a20: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
8a30: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
8a40: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
8a50: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
8a60: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
8a70: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
8a80: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
8a90: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
8aa0: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
8ab0: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
8ac0: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
8ad0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
8ae0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
8af0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
8b00: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
8b10: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
8b20: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
8b30: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
8b40: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
8b50: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
8b60: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
8b70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
8b80: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
8b90: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
8ba0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
8bb0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
8bc0: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
8bd0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
8be0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
8bf0: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
8c00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8c10: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
8c20: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
8c30: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
8c40: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
8c50: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
8c60: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
8c70: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
8c80: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
8c90: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
8ca0: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
8cb0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8cc0: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
8cd0: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
8ce0: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
8cf0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
8d00: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
8d10: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
8d20: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
8d30: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
8d40: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
8d70: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
8d80: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
8d90: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
8da0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
8db0: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
8dc0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
8dd0: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
8de0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
8df0: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
8e00: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
8e10: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
8e20: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
8e30: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
8e40: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
8e50: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
8e60: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
8e70: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8e80: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8e90: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
8ea0: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
8eb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
8ec0: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
8ed0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
8ee0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8ef0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
8f00: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
8f10: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
8f20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
8f30: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
8f40: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
8f50: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
8f60: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
8f70: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
8f80: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
8f90: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
8fa0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
8fb0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
8fc0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
8fd0: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
8fe0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
8ff0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
9000: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
9010: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
9020: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
9030: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
9040: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9050: 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  n(&pE->pLeft->to
9060: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
9070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
9080: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
9090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
90a0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
90b0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
90c0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
90d0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
90e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
90f0: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
9100: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
9110: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
9120: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
9130: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
9140: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
9150: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
9160: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
9170: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
9180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9190: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
91a0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
91b0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
91c0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
91d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
91e0: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
91f0: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
9200: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9210: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
9220: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
9230: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
9240: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
9250: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
9260: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
9270: 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20  *pExpr, *pLeft, 
9280: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
9290: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
92a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
92b0: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
92c0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
92e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
92f0: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
9300: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9320: 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65  (pLeft->jointype
9330: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
9340: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
9360: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
9370: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
9380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9390: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
93a0: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
93b0: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
93c0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
93d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
93e0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
93f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
9400: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9410: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9420: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
9430: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
9440: 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20  (pLeft->pUsing, 
9450: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9470: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
9480: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
9490: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
94a0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
94b0: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
94c0: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
94d0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
94e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
94f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
9500: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9510: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9520: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
9530: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
9540: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
9550: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
9560: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
9570: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
9580: 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f  oken(&pRight->to
9590: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
95a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
95b0: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
95c0: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
95d0: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
95e0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
95f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
9600: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9620: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
9630: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
9640: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
9650: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
9660: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9680: 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74  tToken(&pLeft->t
9690: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
96a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
96b0: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
96c0: 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72  span, sqlite3MPr
96d0: 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54  intf("%s.%s", zT
96e0: 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
96f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9700: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
9710: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
9720: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
9730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9740: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
9750: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
9760: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
9770: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
9780: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
97a0: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
97b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
97c0: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
97d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
97e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
97f0: 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
9800: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9810: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
9820: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
9830: 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70 72  w, pExpr, &pExpr
9840: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  ->span);.       
9850: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9860: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
9870: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9880: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
9890: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
98a0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
98b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
98c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
98d0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
98e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
98f0: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
9900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9910: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9920: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
9930: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
9940: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9950: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9970: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
9980: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
9990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
99a0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
99b0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
99c0: 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  Free(zTName);.  
99d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
99e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
99f0: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
9a00: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
9a10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
9a20: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
9a30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
9a40: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
9a50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9a60: 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69  associates entri
9a70: 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  es in an ORDER B
9a80: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  Y expression lis
9a90: 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  t with.** column
9aa0: 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20  s in a result.  
9ab0: 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42  For each ORDER B
9ac0: 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  Y expression, th
9ad0: 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74  e opcode of.** t
9ae0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
9af0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
9b00: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
9b10: 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  e iColumn value 
9b20: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
9b30: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
9b40: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
9b50: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
9b60: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
9b70: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
9b80: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
9b90: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
9ba0: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
9bb0: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
9bc0: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
9bd0: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
9be0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
9bf0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
9c00: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
9c10: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
9c20: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
9c30: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
9c40: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
9c50: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
9c60: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
9c70: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
9c80: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
9c90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
9ca0: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
9cb0: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
9cc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9cd0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
9ce0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
9cf0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
9d00: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
9d10: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
9d20: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
9d30: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
9d40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
9d50: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
9d60: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
9d70: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
9d80: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
9d90: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
9da0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
9db0: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
9dc0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
9dd0: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
9de0: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
9df0: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
9e00: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
9e10: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
9e20: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
9e30: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
9e40: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
9e50: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
9e60: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
9e70: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
9e80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
9e90: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9ea0: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
9eb0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
9ec0: 20 20 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65    }.  if( prepSe
9ed0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
9ee0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
9ef0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9f00: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
9f10: 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
9f20: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
9f30: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65  lumn(pParse, pSe
9f40: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  lect->pPrior, pO
9f50: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
9f60: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
9f70: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
9f80: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
9f90: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
9fa0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
9fb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9fc0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9fd0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9fe0: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
9ff0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  l = -1;.    if( 
a000: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
a010: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
a020: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
a030: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
a040: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
a050: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
a060: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
a070: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
a080: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a090: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
a0a0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
a0b0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
a0c0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
a0d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
a0e0: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
a0f0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
a100: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
a110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a120: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
a130: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a140: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
a150: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
a160: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
a170: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
a180: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
a190: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
a1a0: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
a1b0: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
a1c0: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
a1d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
a1e0: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
a1f0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
a200: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
a210: 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74    zLabel = sqlit
a220: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
a230: 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pE->token);.   
a240: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61       assert( zLa
a250: 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  bel!=0 );.      
a260: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a270: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
a280: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
a290: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
a2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a2b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62   sqliteFree(zLab
a2c0: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
a2d0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
a2e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
a2f0: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
a300: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
a310: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
a320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a330: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
a340: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
a350: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
a360: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
a370: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
a380: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
a390: 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20  .      pE->iAgg 
a3a0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64  = -1;.      pOrd
a3b0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
a3c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
a3d0: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73  f( iCol<0 && mus
a3e0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
a3f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a400: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
a410: 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
a420: 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73  m number %d does
a430: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72   not match any r
a440: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69  esult column", i
a450: 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  +1);.      nErr+
a460: 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
a470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a480: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
a490: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
a4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a4b0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
a4c0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
a4d0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
a4e0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
a4f0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
a500: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
a510: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
a520: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
a530: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
a540: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
a550: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
a560: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
a570: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
a580: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a590: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
a5a0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
a5b0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
a5c0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
a5d0: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
a5e0: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
a5f0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
a600: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
a610: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
a620: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
a630: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
a640: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
a650: 6f 6e 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64  ons.  nLimit and
a660: 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   nOffset hold th
a670: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
a680: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
a690: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
a6a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
a6b0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
a6c0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
a6d0: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
a6e0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
a6f0: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
a700: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
a710: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
a720: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
a730: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
a740: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
a750: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
a760: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
a770: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
a780: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
a790: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
a7a0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
a7b0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
a7c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a7d0: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
a7e0: 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20  alues if iLimit 
a7f0: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
a800: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
a810: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
a820: 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e  ned by nLimit an
a830: 64 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d nOffset.  iLim
a840: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
a850: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
a860: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
a870: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
a880: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
a890: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
a8a0: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
a8b0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
a8c0: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
a8d0: 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f   nLimit>=0 or nO
a8e0: 66 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c  ffset>0 do the l
a8f0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
a900: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
a910: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
a920: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
a930: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
a940: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
a950: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
a960: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
a970: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
a980: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
a990: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
a9a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
a9b0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
a9c0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
a9d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
a9e0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
a9f0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
aa00: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
aa10: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
aa20: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
aa30: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
aa40: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
aa50: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
aa60: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
aa70: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
aa80: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
aa90: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
aaa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
aab0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  pLimit ){.    in
aac0: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
aad0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
aae0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
aaf0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ab00: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
ab10: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
ab20: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ab30: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
ab40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ab50: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
ab60: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nt, 0, 0);.    s
ab70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ab80: 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20  v, OP_Negative, 
ab90: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
aba0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
abb0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
abc0: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
abd0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d  mment((v, "# LIM
abe0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
abf0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
ac00: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
ac10: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
ac20: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
ac30: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
ac40: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ac50: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ac60: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ac70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
ac80: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ac90: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  rse, p->pOffset)
aca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
acb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
acc0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
acd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ace0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69  dOp(v, OP_Negati
acf0: 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ve, 0, 0);.    s
ad00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ad10: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
ad20: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64  iMem, 1);.    Vd
ad30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
ad40: 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22   OFFSET counter"
ad50: 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73  ));.    p->iOffs
ad60: 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d  et = iMem;.  }.}
ad70: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ad80: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
ad90: 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74   to use for sort
ada0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
adb0: 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e  oid createSortin
adc0: 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  gIndex(Parse *pP
add0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
ade0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
adf0: 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64  rBy){.  if( pOrd
ae00: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
ae10: 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  addr;.    assert
ae20: 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  ( pOrderBy->iECu
ae30: 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70  rsor==0 );.    p
ae40: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
ae50: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
ae60: 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  ++;.    addr = s
ae70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ae80: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
ae90: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 0a 20  P_OpenVirtual,. 
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
aec0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
aed0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
aee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
aef0: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
af00: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70  ] == -1 );.    p
af10: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
af20: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a  ] = addr;.  }.}.
af30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70 63 6f 64  ./*.** The opcod
af40: 65 20 61 74 20 61 64 64 72 20 69 73 20 61 6e 20  e at addr is an 
af50: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 74  OP_OpenVirtual t
af60: 68 61 74 20 63 72 65 61 74 65 64 20 61 20 73 6f  hat created a so
af70: 72 74 69 6e 67 0a 2a 2a 20 69 6e 64 65 78 20 74  rting.** index t
af80: 68 61 20 77 65 20 65 6e 64 65 64 20 75 70 20 6e  ha we ended up n
af90: 6f 74 20 6e 65 65 64 69 6e 67 2e 20 20 54 68 69  ot needing.  Thi
afa0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
afb0: 73 20 74 68 61 74 0a 2a 2a 20 6f 70 63 6f 64 65  s that.** opcode
afc0: 20 74 6f 20 4f 50 5f 4e 6f 6f 70 2e 0a 2a 2f 0a   to OP_Noop..*/.
afd0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 63 72  static void uncr
afe0: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
aff0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b000: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
b010: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b020: 56 64 62 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a  Vdbe;.  VdbeOp *
b030: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
b040: 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 29 3b  eGetOp(v, addr);
b050: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
b060: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
b070: 30 2c 20 30 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70  0, 0);.  pOp->op
b080: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
b090: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20    pOp->p1 = 0;. 
b0a0: 20 70 4f 70 2d 3e 70 32 20 3d 20 30 3b 0a 7d 0a   pOp->p2 = 0;.}.
b0b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b0c0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b0d0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
b0e0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
b0f0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b100: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
b110: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
b120: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
b130: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
b140: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
b150: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
b160: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
b170: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
b180: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
b190: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
b1a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
b1b0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
b1c0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
b1d0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
b1e0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
b1f0: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
b200: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
b210: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b220: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
b230: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
b240: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
b250: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
b260: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
b270: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
b280: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
b290: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
b2a0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
b2b0: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
b2c0: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
b2d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
b2e0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
b2f0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
b300: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
b310: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
b320: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
b330: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b340: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
b350: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
b360: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
b370: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b380: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b390: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
b3a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b3b0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
b3c0: 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65  query that is re
b3d0: 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a  ally the union.*
b3e0: 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f  * or intersectio
b3f0: 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  n of two or more
b400: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
b410: 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  s..**.** "p" poi
b420: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
b430: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
b440: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
b450: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
b460: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
b470: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
b480: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
b490: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
b4a0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
b4b0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
b4c0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
b4d0: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
b4e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
b4f0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
b500: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
b510: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
b520: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
b530: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
b540: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
b550: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
b560: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
b570: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
b580: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
b590: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
b5a0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
b5b0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
b5c0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
b5d0: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
b5e0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
b5f0: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
b600: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
b610: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b620: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
b630: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
b640: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
b680: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
b690: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
b6a0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
b6b0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
b6c0: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
b6d0: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
b6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b6f0: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
b700: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
b710: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
b720: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
b730: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
b740: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
b750: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
b760: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
b770: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
b780: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
b790: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
b7a0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
b7b0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
b7c0: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
b7d0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
b7e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
b7f0: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
b800: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b810: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b820: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
b830: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b840: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
b850: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
b860: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
b870: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
b880: 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f      /* \___  Sto
b890: 72 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  re query results
b8a0: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f   as specified */
b8b0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
b8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20 20 20           /* /   
b8d0: 20 20 62 79 20 74 68 65 73 65 20 74 77 6f 20 70    by these two p
b8e0: 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20 20 20  arameters.      
b8f0: 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66     */.  char *af
b900: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f             /*
b910: 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
b920: 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
b930: 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
b940: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b950: 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
b960: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
b970: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b980: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
b990: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
b9a0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
b9b0: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
b9c0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
b9e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b9f0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
ba00: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
ba10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ba20: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
ba30: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
ba40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ba50: 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
ba60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
ba70: 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74   p */.  int aSet
ba80: 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  P2[2];        /*
ba90: 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66   Set P2 value of
baa0: 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d   these op to num
bab0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
bac0: 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d  /.  int nSetP2 =
bad0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
bae0: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20  ber of slots in 
baf0: 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f  aSetP2[] used */
bb00: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
bb10: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
bb20: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
bb30: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
bb40: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
bb50: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
bb60: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
bb70: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
bb80: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
bb90: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
bba0: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  /.  if( p==0 || 
bbb0: 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
bbc0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bbd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bbe0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72  t_end;.  }.  pPr
bbf0: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
bc00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
bc10: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
bc20: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
bc30: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
bc40: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
bc50: 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50  most );.  if( pP
bc60: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
bc70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bc80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
bc90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
bca0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
bcb0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
bcc0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
bcd0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
bce0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
bcf0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bd00: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
bd10: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
bd20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bd30: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
bd40: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
bd50: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
bd60: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
bd70: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
bd80: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
bd90: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
bda0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bdb0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
bdc0: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
bdd0: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
bde0: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
bdf0: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
be00: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
be10: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
be20: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( v==0 ){.    r
be30: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
be40: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
be50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
be60: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
be70: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
be80: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
be90: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
bea0: 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  ==SRT_VirtualTab
beb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bec0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
bed0: 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
bee0: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
bef0: 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
bf00: 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b 6e   );.    aSetP2[n
bf10: 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74  SetP2++] = sqlit
bf20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bf30: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69  P_OpenVirtual, i
bf40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44  Parm, 0);.    eD
bf50: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
bf60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
bf70: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
bf80: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
bf90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bfa0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72  s..  */.  pOrder
bfb0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
bfc0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
bfd0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
bfe0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
bff0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
c000: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c010: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
c020: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
c030: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
c040: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
c050: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
c060: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
c070: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c080: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c090: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
c0a0: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c0b0: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  aff);.        if
c0c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c0d0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c0e0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c0f0: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
c100: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c110: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
c120: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
c130: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c140: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c150: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  et;.        p->p
c160: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
c170: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c180: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
c190: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c1a0: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
c1b0: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c1c0: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
c1d0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
c1e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
c1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
c200: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c210: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
c220: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c230: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
c240: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
c250: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
c260: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
c270: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
c280: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
c290: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
c2a0: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
c2b0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
c2c0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c2d0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
c2e0: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
c2f0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
c300: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
c310: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c320: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
c330: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
c340: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
c350: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
c360: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
c370: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
c380: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
c390: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
c3a0: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
c3b0: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
c3c0: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
c3d0: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
c3e0: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
c3f0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
c400: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
c410: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
c420: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
c430: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
c440: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70  OrderBy==0 && !p
c450: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e  ->pLimit && !p->
c460: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
c470: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
c480: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
c490: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
c4a0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
c4b0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
c4c0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
c4d0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
c4e0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
c4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c500: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
c510: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
c520: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c530: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
c540: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
c550: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
c560: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c570: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
c580: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
c590: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
c5a0: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
c5b0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
c5c0: 70 2c 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p, pOrderBy, uni
c5d0: 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20  onTab,1) ){.    
c5e0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c5f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c600: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c620: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c630: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
c640: 70 65 6e 56 69 72 74 75 61 6c 2c 20 75 6e 69 6f  penVirtual, unio
c650: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
c660: 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
c670: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
c680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
c690: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
c6a0: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
c6b0: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
c6c0: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
c6d0: 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
c6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c700: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
c710: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
c720: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
c730: 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[0] = addr;.  
c740: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
c750: 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20  tmost->usesVirt 
c760: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
c770: 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
c780: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
c790: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
c7a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c7b0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
c7c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c7d0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
c7e0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
c7f0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
c800: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
c810: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
c820: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c830: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c840: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
c850: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
c860: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
c870: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c880: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c890: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c8a0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
c8b0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
c8c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
c8d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
c8e0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
c8f0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
c900: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
c910: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
c920: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
c930: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
c940: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
c950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c960: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
c970: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
c980: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
c990: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
c9a0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
c9b0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
c9c0: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
c9d0: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
c9e0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
c9f0: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
ca00: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
ca10: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
ca20: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ca30: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ca40: 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61  , p, op, unionTa
ca50: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
ca60: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
ca70: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
ca80: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
ca90: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
caa0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
cab0: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
cac0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
cad0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
cae0: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
caf0: 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
cb00: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mit = -1;.      
cb10: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b  p->iOffset = -1;
cb20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
cb30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
cb40: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
cb50: 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20        }...      
cb60: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
cb70: 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
cb80: 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
cb90: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
cba0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
cbb0: 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
cbc0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20  eed..      */   
cbd0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65 44     .      if( eD
cbe0: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
cbf0: 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20  unionTab!=iParm 
cc00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
cc10: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
cc20: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
cc30: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cc40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  );.        if( e
cc50: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
cc60: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
cc70: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
cc80: 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
cc90: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
cca0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
ccb0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
ccc0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ccd0: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
cce0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ccf0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
cd00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd10: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
cd20: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
cd30: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
cd40: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
cd50: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
cd60: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
cd70: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cd80: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
cd90: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
cda0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
cdb0: 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e  p->pEList, union
cdc0: 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  Tab, p->pEList->
cdd0: 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31      pOrderBy, -1
ce00: 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20  , eDest, iParm, 
ce10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
ce30: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  ont, iBreak, 0);
ce40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
ce50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
ce60: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
ce70: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
ce80: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
ce90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cea0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ceb0: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
cec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ced0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
cee0: 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
cef0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cf00: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cf10: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
cf20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cf30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
cf40: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
cf50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cf60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cf70: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
cf80: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
cf90: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
cfa0: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
cfb0: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
cfc0: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
cfd0: 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
cfe0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20    int addr;..   
cff0: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
d000: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
d010: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
d020: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
d030: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
d040: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
d050: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
d060: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
d070: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
d080: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
d090: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
d0a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
d0b0: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
d0c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
d0d0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
d0e0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  ++;.      if( pO
d0f0: 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f  rderBy && matchO
d100: 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70  rderbyToColumn(p
d110: 50 61 72 73 65 2c 70 2c 70 4f 72 64 65 72 42 79  Parse,p,pOrderBy
d120: 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20  ,tab1,1) ){.    
d130: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d140: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d150: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
d160: 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74 65 53   }.      createS
d170: 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
d180: 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29  se, p, pOrderBy)
d190: 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
d1a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d1b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
d1c0: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
d1d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d1e0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d  ddrOpenVirt[0] =
d1f0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
d200: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d  >addrOpenVirt[0]
d210: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
d220: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
d230: 65 73 56 69 72 74 20 3d 20 31 3b 0a 20 20 20 20  esVirt = 1;.    
d240: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
d250: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
d260: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
d270: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
d280: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
d290: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
d2a0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
d2b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
d2c0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
d2d0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
d2e0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d2f0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
d300: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d310: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d320: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
d330: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
d340: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
d350: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
d360: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
d370: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d380: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
d390: 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 32  penVirtual, tab2
d3a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
d3b0: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56  rt( p->addrOpenV
d3c0: 69 72 74 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  irt[1] == -1 );.
d3d0: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
d3e0: 6e 56 69 72 74 5b 31 5d 20 3d 20 61 64 64 72 3b  nVirt[1] = addr;
d3f0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
d400: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
d410: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
d420: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d430: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
d440: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
d450: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
d460: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
d470: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d480: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
d490: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
d4a0: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d4b0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
d4c0: 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ior;.      sqlit
d4d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
d4e0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d4f0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
d500: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d510: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
d520: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d530: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d540: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d550: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d560: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d570: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
d580: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
d590: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
d5a0: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
d5b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
d5c0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d5d0: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
d5e0: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
d5f0: 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  {.        genera
d600: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
d610: 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69  arse, 0, p->pELi
d620: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
d630: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
d640: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d650: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
d660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d670: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d690: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
d6a0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
d6b0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
d6c0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
d6d0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53  se, p);.      iS
d6e0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
d6f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
d700: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
d710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d720: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
d730: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
d740: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
d750: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
d760: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
d770: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
d780: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
d7b0: 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  rBy, -1, eDest, 
d7c0: 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65       iCont, iBre
d7f0: 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ak, 0);.      if
d800: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d810: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
d820: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d830: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
d840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d850: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
d860: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
d870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d880: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
d890: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
d8a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d8b0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
d8c0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
d8d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d8e0: 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
d8f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d910: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
d920: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d930: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
d940: 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
d950: 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
d960: 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
d970: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
d980: 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
d990: 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
d9a0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d9b0: 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
d9c0: 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
d9d0: 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
d9e0: 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
d9f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
da00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
da10: 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
da20: 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
da30: 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
da40: 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
da50: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
da60: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
da70: 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
da80: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
da90: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
daa0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
dab0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
dac0: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
dad0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d  f columns in tem
dae0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20 20  porary tables.  
daf0: 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  */.  nCol = p->p
db00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
db10: 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29 7b  while( nSetP2 ){
db20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
db30: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65 74  ChangeP2(v, aSet
db40: 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43  P2[--nSetP2], nC
db50: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
db60: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
db70: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
db80: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
db90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
dba0: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
dbb0: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
dbc0: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
dbd0: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
dbe0: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
dbf0: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
dc00: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
dc10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
dc20: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
dc30: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
dc40: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
dc50: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
dc60: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
dc70: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
dc80: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
dc90: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
dca0: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
dcb0: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
dcc0: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
dcd0: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
dce0: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
dcf0: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
dd00: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
dd10: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
dd20: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
dd30: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
dd40: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
dd50: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
dd60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
dd70: 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73 56  erBy || p->usesV
dd80: 69 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  irt ){.    int i
dd90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ddb0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
ddc0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ddd0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
dde0: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
ddf0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
de00: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
de10: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
de20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
de30: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
de40: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
de50: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
de60: 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20  Seq **apColl;.  
de70: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70    CollSeq **aCop
de80: 79 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  y;..    assert( 
de90: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
dea0: 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f   );.    pKeyInfo
deb0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
dec0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
ded0: 29 2b 6e 43 6f 6c 2a 32 2a 73 69 7a 65 6f 66 28  )+nCol*2*sizeof(
dee0: 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c  CollSeq*) + nCol
def0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
df00: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
df10: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
df20: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
df30: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
df40: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
df50: 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  o->enc = pParse-
df60: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4b  >db->enc;.    pK
df70: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
df80: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
df90: 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
dfa0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
dfb0: 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
dfc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
dfd0: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
dfe0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
dff0: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
e000: 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
e010: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
e020: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
e030: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
e040: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
e050: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
e060: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
e070: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
e080: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
e090: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
e0a0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
e0b0: 6e 56 69 72 74 5b 69 5d 3b 0a 20 20 20 20 20 20  nVirt[i];.      
e0c0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
e0d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
e0e0: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
e0f0: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
e100: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
e110: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
e120: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
e130: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
e140: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
e150: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
e160: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e170: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
e180: 6e 56 69 72 74 5b 31 5d 3c 30 20 29 3b 0a 20 20  nVirt[1]<0 );.  
e190: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e1a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e1c0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
e1d0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e1e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e1f0: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
e200: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
e210: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
e220: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
e230: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
e240: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
e250: 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20  _item *pOTerm = 
e260: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20  pOrderBy->a;.   
e270: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
e280: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
e290: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
e2a0: 20 20 20 20 20 20 75 38 20 2a 70 53 6f 72 74 4f        u8 *pSortO
e2b0: 72 64 65 72 3b 0a 0a 20 20 20 20 20 20 61 43 6f  rder;..      aCo
e2c0: 70 79 20 3d 20 28 43 6f 6c 6c 53 65 71 2a 2a 29  py = (CollSeq**)
e2d0: 26 70 4b 65 79 49 6e 66 6f 5b 31 5d 3b 0a 20 20  &pKeyInfo[1];.  
e2e0: 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d      pSortOrder =
e2f0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
e300: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43  Order = (u8*)&aC
e310: 6f 70 79 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20  opy[nExpr];.    
e320: 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79 2c 20    memcpy(aCopy, 
e330: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c  pKeyInfo->aColl,
e340: 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c   nCol*sizeof(Col
e350: 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 20 20 61  lSeq*));.      a
e360: 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f  pColl = pKeyInfo
e370: 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66  ->aColl;.      f
e380: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
e390: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
e3a0: 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c  pOTerm++, apColl
e3b0: 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b  ++, pSortOrder++
e3c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
e3d0: 2a 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d  *pExpr = pOTerm-
e3e0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
e3f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f  char *zName = pO
e400: 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Term->zName;.   
e410: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e420: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e430: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  N && pExpr->iCol
e440: 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  umn<nCol );.    
e450: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
e460: 0a 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f  .          *apCo
e470: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
e480: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
e490: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  , zName, -1);.  
e4a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e4b0: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
e4c0: 20 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43   aCopy[pExpr->iC
e4d0: 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20  olumn];.        
e4e0: 7d 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74  }.        *pSort
e4f0: 4f 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  Order = pOTerm->
e500: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
e510: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
e520: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
e530: 70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  p );.      asser
e540: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69  t( p->addrOpenVi
e550: 72 74 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  rt[2]>=0 );.    
e560: 20 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72    addr = p->addr
e570: 4f 70 65 6e 56 69 72 74 5b 32 5d 3b 0a 20 20 20  OpenVirt[2];.   
e580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e590: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
e5a0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e5b0: 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  +2);.      pKeyI
e5c0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4f  nfo->nField = pO
e5d0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
e5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e5f0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
e600: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
e610: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
e620: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b  NDOFF);.      pK
e630: 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  eyInfo = 0;.    
e640: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
e650: 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
e660: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e670: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
e680: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
e690: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
e6a0: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
e6b0: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75  lect_end:.  retu
e6c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
e6d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
e6e0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
e6f0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
e700: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
e710: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
e720: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
e730: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
e740: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
e750: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
e760: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
e770: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
e780: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
e790: 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
e7a0: 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
e7b0: 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
e7c0: 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
e7d0: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
e7e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e7f0: 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
e800: 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
e810: 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
e820: 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
e830: 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
e840: 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
e850: 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
e860: 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
e870: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
e880: 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
e890: 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
e8a0: 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
e8b0: 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
e8c0: 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
e8d0: 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
e8e0: 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
e8f0: 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
e900: 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
e910: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
e920: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
e930: 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
e940: 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
e950: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e960: 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
e970: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
e980: 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
e990: 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
e9a0: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
e9b0: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
e9c0: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
e9d0: 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
e9e0: 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
e9f0: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
ea00: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
ea10: 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
ea20: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
ea30: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
ea40: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
ea50: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
ea60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
ea70: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
ea80: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
ea90: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
eaa0: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
eab0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
eac0: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
ead0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
eae0: 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
eaf0: 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
eb00: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
eb10: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
eb20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
eb30: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
eb40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
eb50: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
eb60: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
eb70: 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
eb80: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
eb90: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
eba0: 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
ebb0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
ebc0: 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
ebd0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
ebe0: 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
ebf0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
ec00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
ec10: 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
ec20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ec30: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
ec40: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
ec50: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
ec60: 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
ec70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ec80: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
ec90: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
eca0: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
ecb0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
ecc0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
ecd0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
ece0: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
ecf0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
ed00: 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
ed10: 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
ed20: 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
ed30: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
ed40: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
ed50: 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
ed60: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
ed70: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
ed80: 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
ed90: 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
eda0: 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74    pExpr->pSelect
edb0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
edc0: 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63  Dup(pNew->pSelec
edd0: 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
ede0: 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
edf0: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
ee00: 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
ee10: 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
ee20: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
ee30: 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
ee40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
ee50: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
ee60: 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
ee70: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
ee80: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
ee90: 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
eea0: 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
eeb0: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
eec0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
eed0: 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
eee0: 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
eef0: 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
ef00: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
ef10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
ef20: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
ef30: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
ef40: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
ef50: 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
ef60: 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
ef70: 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
ef80: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
ef90: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
efa0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
efb0: 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
efc0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
efd0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
efe0: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
eff0: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  t(p->pEList, iTa
f000: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f010: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
f020: 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
f030: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
f040: 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
f050: 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
f060: 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
f070: 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
f080: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
f090: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70  );.  substExpr(p
f0a0: 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
f0b0: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
f0c0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
f0d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f0e0: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
f0f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
f100: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f110: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
f120: 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
f130: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
f140: 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
f150: 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
f160: 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
f170: 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
f180: 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
f190: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
f1a0: 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
f1b0: 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
f1c0: 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
f1d0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
f1e0: 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
f1f0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
f200: 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
f210: 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
f220: 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
f230: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
f240: 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
f250: 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
f260: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
f270: 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
f280: 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
f290: 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
f2a0: 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
f2b0: 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
f2c0: 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
f2d0: 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
f2e0: 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
f2f0: 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
f300: 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
f310: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
f320: 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
f330: 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
f340: 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
f350: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
f360: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f370: 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
f380: 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
f390: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
f3a0: 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
f3b0: 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
f3c0: 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
f3d0: 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
f3e0: 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
f3f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
f400: 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
f410: 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
f420: 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
f430: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
f440: 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
f450: 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
f460: 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
f470: 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
f480: 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
f490: 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
f4a0: 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
f4b0: 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
f4c0: 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
f4d0: 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
f4e0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
f4f0: 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
f500: 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
f510: 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
f520: 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
f530: 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
f540: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
f550: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
f560: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
f570: 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
f580: 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
f590: 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
f5a0: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
f5b0: 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
f5c0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
f5d0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
f5e0: 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
f5f0: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
f600: 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
f610: 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
f620: 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
f630: 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
f640: 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
f650: 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
f660: 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
f670: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f680: 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
f690: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
f6a0: 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
f6b0: 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
f6c0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
f6d0: 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
f6e0: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
f6f0: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
f700: 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
f710: 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
f720: 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
f730: 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
f740: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f750: 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
f760: 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
f770: 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
f780: 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
f790: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
f7a0: 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
f7b0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f7c0: 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
f7d0: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
f7e0: 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
f7f0: 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
f800: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
f810: 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
f820: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
f830: 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
f840: 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
f850: 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
f860: 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
f870: 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
f880: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f890: 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
f8a0: 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
f8b0: 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
f8c0: 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
f8d0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
f8e0: 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
f8f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
f900: 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
f910: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
f920: 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
f930: 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
f940: 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
f950: 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
f960: 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
f970: 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
f980: 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
f990: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
f9a0: 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
f9b0: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
f9c0: 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
f9d0: 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
f9e0: 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
f9f0: 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
fa00: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
fa10: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
fa20: 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
fa30: 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
fa40: 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
fa50: 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
fa60: 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
fa70: 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
fa80: 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
fa90: 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
faa0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
fab0: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
fac0: 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
fad0: 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
fae0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
faf0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
fb00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
fb10: 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
fb20: 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
fb30: 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
fb40: 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
fb50: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
fb60: 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
fb70: 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
fb80: 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
fb90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
fba0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
fbb0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
fbc0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
fbd0: 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
fbe0: 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
fbf0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
fc00: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
fc10: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
fc20: 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
fc30: 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
fc40: 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20  /.  int isAgg,  
fc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
fc60: 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
fc70: 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
fc80: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
fc90: 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nt subqueryIsAgg
fca0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
fcb0: 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
fcc0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
fcd0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ions */.){.  Sel
fce0: 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
fcf0: 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
fd00: 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
fd10: 22 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  " */.  SrcList *
fd20: 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
fd30: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
fd40: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
fd50: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
fd60: 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
fd70: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
fd80: 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
fd90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
fda0: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
fdb0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
fdc0: 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
fdd0: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
fde0: 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
fdf0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
fe00: 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
fe10: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
fe20: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
fe30: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
fe40: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
fe50: 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
fe60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fe70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
fe80: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
fe90: 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
fea0: 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
feb0: 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  uery */..  /* Ch
fec0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c  eck to see if fl
fed0: 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
fee0: 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30  itted.  Return 0
fef0: 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20   if not..  */.  
ff00: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ff10: 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
ff20: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
ff30: 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
ff40: 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
ff50: 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
ff60: 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
ff70: 46 72 6f 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20  From];.  pSub = 
ff80: 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
ff90: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
ffa0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  b!=0 );.  if( is
ffb0: 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49  Agg && subqueryI
ffc0: 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
ffd0: 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
ffe0: 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
fff0: 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
10000 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
10010 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
10020 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
10030 69 66 28 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69  if( (pSub->pLimi
10040 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 29 20  t && p->pLimit) 
10050 7c 7c 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  || pSub->pOffset
10060 20 7c 7c 20 0a 20 20 20 20 20 20 28 70 53 75 62   || .      (pSub
10070 2d 3e 70 4c 69 6d 69 74 20 26 26 20 69 73 41 67  ->pLimit && isAg
10080 67 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  g) ) return 0;. 
10090 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
100a0 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
100b0 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 69 73  ;.  if( pSub->is
100c0 44 69 73 74 69 6e 63 74 20 26 26 20 28 70 53 72  Distinct && (pSr
100d0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
100e0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
100f0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
10100 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  p->isDistinct &&
10110 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
10120 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
10130 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
10140 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
10150 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
10160 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
10170 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
10180 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
10190 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
101a0 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
101b0 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
101c0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
101d0 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
101e0 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
101f0 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
10200 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
10210 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
10220 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
10230 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
10240 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
10250 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
10260 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
10270 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
10280 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
10290 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
102a0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
102b0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
102c0 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
102d0 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
102e0 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
102f0 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
10300 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
10310 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
10320 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10330 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
10340 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
10350 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
10360 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
10370 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
10380 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
10390 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
103a0 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
103b0 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
103c0 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
103d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
103e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
103f0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
10400 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
10410 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
10420 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
10430 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
10440 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
10450 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
10460 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
10470 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
10480 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
10490 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
104a0 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
104b0 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
104c0 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
104d0 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
104e0 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
104f0 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
10500 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
10510 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
10520 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
10530 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
10540 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
10550 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
10560 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
10570 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10580 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
10590 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
105a0 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
105b0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
105c0 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
105d0 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
105e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
105f0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
10600 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
10610 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
10620 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
10630 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
10640 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
10650 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
10660 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
10670 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
10680 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
10690 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
106a0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
106b0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
106c0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
106d0 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
106e0 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
106f0 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
10700 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
10710 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
10720 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
10730 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
10740 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
10750 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
10760 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
10770 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
10780 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
10790 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
107a0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
107b0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
107c0 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
107d0 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
107e0 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
107f0 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
10800 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
10810 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
10820 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
10830 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20  ->jointype;..   
10840 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
10850 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d  ble(0, pSubitem-
10860 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
10870 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
10880 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
10890 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
108a0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
108b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
108c0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
108d0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
108e0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
108f0 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
10900 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
10910 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
10920 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
10930 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
10940 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c  tAppend(pSrc, 0,
10950 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10960 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
10970 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
10980 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
10990 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
109a0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
109b0 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
109c0 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
109d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
109e0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
109f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
10a00 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
10a10 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
10a20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
10a30 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
10a40 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
10a50 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
10a60 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53  pSrc->a[iFrom+nS
10a70 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ubSrc-1].jointyp
10a80 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
10a90 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
10aa0 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
10ab0 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
10ac0 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
10ad0 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
10ae0 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
10af0 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
10b00 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
10b10 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
10b20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
10b30 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
10b40 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
10b50 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
10b60 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
10b70 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
10b80 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10b90 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
10ba0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
10bb0 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
10bc0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10bd0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
10be0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
10bf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10c00 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
10c10 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
10c20 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
10c30 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
10c40 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
10c50 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
10c60 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
10c70 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
10c80 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
10c90 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
10ca0 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78  ..  */.  substEx
10cb0 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
10cc0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10cd0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73  >pEList);.  pLis
10ce0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
10cf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
10d00 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10d10 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
10d20 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
10d30 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
10d40 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
10d50 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
10d60 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
10d70 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
10d80 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
10d90 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  up(pExpr->span.z
10da0 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
10db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10dc0 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
10dd0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
10de0 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
10df0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10e00 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
10e10 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
10e20 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10e30 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
10e40 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
10e50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10e60 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
10e70 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10e80 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
10e90 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
10ea0 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  By = 0;.  }else 
10eb0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
10ec0 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
10ed0 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
10ee0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10ef0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
10f00 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
10f10 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
10f20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10f30 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
10f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
10f50 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
10f60 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
10f70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10f80 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
10f90 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
10fa0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
10fb0 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
10fc0 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
10fd0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
10fe0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
10ff0 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  ist);.    p->pHa
11000 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
11010 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67  prAnd(p->pHaving
11020 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
11030 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29  (pSub->pHaving))
11040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
11050 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
11060 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
11070 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
11080 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75  tDup(pSub->pGrou
11090 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
110a0 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
110b0 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
110c0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
110d0 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
110e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
110f0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
11100 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
11110 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
11120 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
11130 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
11140 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
11150 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
11160 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
11170 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
11180 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
11190 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
111a0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45  ..  /*.  ** SELE
111b0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
111c0 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
111d0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
111e0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2f  x OFFSET y;.  */
111f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
11200 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  mit ){.    p->pL
11210 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
11220 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  mit;.    pSub->p
11230 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Limit = 0;.  }..
11240 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
11250 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
11260 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
11270 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
11280 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
11290 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
112a0 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
112b0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
112c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
112d0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
112e0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
112f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
11300 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
11310 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
11320 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
11330 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
11340 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
11350 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
11360 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
11370 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
11380 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
11390 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
113a0 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
113b0 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
113c0 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
113d0 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74  s SELECT and ret
113e0 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
113f0 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
11400 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11410 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
11420 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
11430 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
11440 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
11450 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
11460 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
11470 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
11480 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
11490 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
114a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
114b0 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
114c0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
114d0 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
114e0 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
114f0 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
11500 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
11510 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
11520 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
11530 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
11540 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
11550 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
11560 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
11570 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
11580 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11590 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
115a0 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
115b0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
115c0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
115d0 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
115e0 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  for sqlite3Selec
115f0 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  t()..** See the 
11600 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
11610 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
11620 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
11630 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
11640 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d  atic int simpleM
11650 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
11660 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11670 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
11680 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78  int iParm){.  Ex
11690 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
116a0 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
116b0 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
116c0 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
116d0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
116e0 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20  t seekOp;.  int 
116f0 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  cont;.  ExprList
11700 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
11710 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
11720 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11730 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
11740 4c 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20 20 2f  List *pSrc;..  /
11750 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
11760 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
11770 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
11780 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
11790 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
117a0 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
117b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
117c0 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
117d0 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
117e0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
117f0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
11800 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
11810 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11820 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
11830 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
11840 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
11850 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
11860 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
11870 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
11880 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
11890 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
118a0 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
118b0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
118c0 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
118d0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
118e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
118f0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
11900 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
11910 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
11920 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
11930 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
11940 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
11950 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
11960 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
11970 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
11980 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
11990 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
119a0 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
119b0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
119c0 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
119d0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
119e0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
119f0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
11a00 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
11a10 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
11a20 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
11a30 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
11a40 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
11a50 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
11a60 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
11a70 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
11a80 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
11a90 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
11aa0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
11ab0 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
11ac0 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
11ad0 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
11ae0 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
11af0 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
11b00 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
11b10 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
11b20 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
11b30 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
11b40 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
11b50 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
11b60 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
11b70 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
11b80 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
11b90 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
11ba0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
11bb0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
11bc0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11bd0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72   pExpr);.    for
11be0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11bf0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11c00 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11c10 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11c20 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
11c30 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
11c40 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
11c50 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66   && pIdx->keyInf
11c60 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c  o.aColl[0]==pCol
11c70 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
11c80 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
11c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
11ca0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
11cb0 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
11cc0 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
11cd0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
11ce0 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
11cf0 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
11d00 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
11d10 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
11d20 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
11d30 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
11d40 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
11d50 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
11d60 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
11d70 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
11d80 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11d90 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11da0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
11db0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
11dc0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
11dd0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
11de0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
11df0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
11e00 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11e10 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20  _VirtualTab ){. 
11e20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11e30 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
11e40 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29  rtual, iParm, 1)
11e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
11e60 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66  rating code to f
11e70 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74  ind the min or t
11e80 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c  he max.  Basical
11e90 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20  ly all we have. 
11ea0 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e   ** to do is fin
11eb0 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74  d the first or t
11ec0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
11ed0 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65   the chosen inde
11ee0 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  x.  If.  ** the 
11ef0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
11f00 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52  s on the INTEGER
11f10 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
11f20 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  en find the firs
11f30 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65  t.  ** or last e
11f40 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e  ntry in the main
11f50 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73   table..  */.  s
11f60 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
11f70 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
11f80 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73  Tab->iDb);.  bas
11f90 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  e = pSrc->a[0].i
11fa0 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74  Cursor;.  comput
11fb0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
11fc0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
11fd0 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
11fe0 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
11ff0 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46  qlite3OpenTableF
12000 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 62 61 73  orReading(v, bas
12010 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  e, pTab);.  }.  
12020 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
12030 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12040 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
12050 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12060 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
12070 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c   base, 0);.  }el
12080 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20  se{.    /* Even 
12090 74 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f  though the curso
120a0 72 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  r used to open t
120b0 68 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73  he index here is
120c0 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61   closed.    ** a
120d0 73 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67  s soon as a sing
120e0 6c 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65  le value has bee
120f0 6e 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20  n read from it, 
12100 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20  allocate it.    
12110 2a 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65  ** using (pParse
12120 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65  ->nTab++) to pre
12130 76 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20  vent the cursor 
12140 69 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20  id from being . 
12150 20 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68     ** reused. Th
12160 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
12170 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  for statements o
12180 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20  f the form .    
12190 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ** "INSERT INTO 
121a0 78 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46  x SELECT max() F
121b0 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20  ROM x"..    */. 
121c0 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20     int iIdx;.   
121d0 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
121e0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
121f0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12200 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
12210 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
12220 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
12230 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
12240 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a  dx, pIdx->tnum,.
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d     (char*)&pIdx-
12270 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
12280 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20 73  INFO);.    if( s
12290 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  eekOp==OP_Rewind
122a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
122b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
122c0 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
122d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
122e0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
122f0 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ecord, 1, 0);.  
12300 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
12310 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20  MoveGt;.    }.  
12320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12330 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49  Op(v, seekOp, iI
12340 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
12350 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12360 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
12370 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
12380 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12390 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
123a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
123b0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
123c0 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
123d0 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
123e0 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
123f0 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
12400 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
12410 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
12420 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
12430 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
12440 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
12450 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
12460 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
12470 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
12480 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
12490 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
124a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
124b0 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
124c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
124d0 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
124e0 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
124f0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
12500 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
12510 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
12520 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54  ause in a SELECT
12530 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
12540 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
12550 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
12560 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52  ..**.** An ORDER
12570 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
12580 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  is a list of exp
12590 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e  ressions.  If an
125a0 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  y expression.** 
125b0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
125c0 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61  nstant, then tha
125d0 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
125e0 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a  replaced by the.
125f0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
12600 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65   entry in the re
12610 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
12620 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
12630 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
12640 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
12650 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
12660 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
12670 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  CT statement. */
12680 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
12690 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20  derBy,   /* The 
126a0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
126b0 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  P BY clause to b
126c0 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
126d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
126e0 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72  pe     /* Either
126f0 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
12700 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  UP", as appropri
12710 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
12720 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
12730 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
12740 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ist;     /* The 
12750 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
12760 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61  e SELECT */.  Pa
12770 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
12780 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
12790 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
127a0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a   of the SELECT *
127b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  /.  assert( pELi
127c0 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72  st );..  if( pOr
127d0 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
127e0 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
127f0 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
12800 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
12810 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
12820 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
12830 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12840 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
12850 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
12860 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
12870 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
12880 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
12890 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
128a0 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
128b0 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
128c0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
128d0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
128e0 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
128f0 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
12900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12910 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12920 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12930 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f         "%s BY co
12940 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
12950 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
12960 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
12970 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
12980 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20  and %d", zType, 
12990 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
129a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
129b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
129c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
129d0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
129e0 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29  Names(pNC, pE) )
129f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
12a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12a10 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
12a20 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20  stant(pE) ){.   
12a30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12a40 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
12a50 20 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d       "%s BY term
12a60 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
12a70 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
12a80 6e 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  nts", zType);.  
12a90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12aa0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12ab0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12ac0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
12ad0 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
12ae0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
12af0 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
12b00 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
12b10 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
12b20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12b30 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
12b40 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
12b50 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
12b60 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
12b70 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
12b80 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
12b90 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
12ba0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
12bb0 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
12bc0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12bd0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
12be0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12bf0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12c00 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
12c10 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
12c20 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
12c30 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
12c40 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
12c50 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
12c60 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
12c70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
12c80 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
12c90 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
12ca0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12cc0 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
12cd0 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
12ce0 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
12cf0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
12d00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
12d10 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
12d20 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
12d30 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
12d40 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
12d50 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
12d60 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
12d70 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
12d80 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
12d90 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
12da0 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
12db0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
12dc0 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
12dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12de0 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
12df0 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
12e00 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
12e10 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
12e20 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
12e30 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12e40 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
12e50 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
12e60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
12e70 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
12e80 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
12e90 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
12ea0 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
12eb0 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
12ec0 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
12ed0 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
12ee0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
12ef0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
12f00 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
12f10 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
12f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12f30 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
12f40 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
12f50 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
12f60 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
12f70 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
12f80 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
12f90 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
12fa0 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
12fb0 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
12fc0 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  ntext..  */.  sN
12fd0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
12fe0 65 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20  e;.  sNC.hasAgg 
12ff0 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20  = 0;.  sNC.nErr 
13000 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20  = 0;.  sNC.nRef 
13010 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73  = 0;.  sNC.pELis
13020 74 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c  t = 0;.  sNC.all
13030 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43  owAgg = 0;.  sNC
13040 2e 70 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20  .pSrcList = 0;. 
13050 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
13060 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13070 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
13080 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c  NC, p->pLimit) |
13090 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  |.      sqlite3E
130a0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
130b0 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74  &sNC, p->pOffset
130c0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
130d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
130e0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  }..  /* Set up t
130f0 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  he local name-co
13100 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f  ntext to pass to
13110 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65   ExprResolveName
13120 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f  s() to.  ** reso
13130 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
13140 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  on-list..  */.  
13150 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  sNC.allowAgg = 1
13160 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
13170 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e   = p->pSrc;.  sN
13180 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72  C.pNext = pOuter
13190 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  NC;..  /* Resolv
131a0 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72  e names in the r
131b0 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
131c0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
131d0 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73  st;.  if( !pELis
131e0 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
131f0 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69  E_ERROR;.  for(i
13200 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
13210 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
13220 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74  xpr *pX = pEList
13230 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
13240 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13250 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
13260 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20  NC, pX) ){.     
13270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13280 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
13290 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
132a0 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  re no aggregate 
132b0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  functions in the
132c0 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64   result-set, and
132d0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20   no GROUP BY .  
132e0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64  ** expression, d
132f0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72  o not allow aggr
13300 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66  egates in any of
13310 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
13320 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ssions..  */.  a
13330 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67  ssert( !p->isAgg
13340 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d   );.  pGroupBy =
13350 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
13360 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20  if( pGroupBy || 
13370 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20  sNC.hasAgg ){.  
13380 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a    p->isAgg = 1;.
13390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43    }else{.    sNC
133a0 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20  .allowAgg = 0;. 
133b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41   }..  /* If a HA
133c0 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
133d0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
133e0 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f  re must be a GRO
133f0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
13400 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76  */.  if( p->pHav
13410 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
13420 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13430 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13440 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
13450 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
13460 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
13470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13480 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
13490 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65  /* Add the expre
134a0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68  ssion list to th
134b0 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62  e name-context b
134c0 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68  efore parsing th
134d0 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70  e.  ** other exp
134e0 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
134f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13500 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  . This is so tha
13510 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  t.  ** expressio
13520 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
13530 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61  clause (etc.) ca
13540 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65  n refer to expre
13550 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61  ssions by.  ** a
13560 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
13570 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20  sult set..  **. 
13580 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a   ** Minor point:
13590 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
135a0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65  case, then the e
135b0 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  xpression will b
135c0 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61  e.  ** re-evalua
135d0 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66  ted for each ref
135e0 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20  erence to it..  
135f0 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  */.  sNC.pEList 
13600 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
13610 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
13620 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
13630 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20   p->pWhere) ||. 
13640 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13650 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
13660 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c  C, p->pHaving) |
13670 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
13680 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
13690 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
136a0 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20  ORDER") ||.     
136b0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
136c0 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75  upBy(&sNC, pGrou
136d0 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20 20  pBy, "GROUP").  
136e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
136f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
13700 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13710 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
13720 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
13730 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
13740 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
13750 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
13760 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
13770 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13780 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30  ;.  .    for(i=0
13790 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
137a0 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
137b0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
137c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
137d0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
137e0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45  (pItem->pExpr, E
137f0 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
13800 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13810 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65  g(pParse, "aggre
13820 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
13830 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
13840 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
13850 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
13860 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
13870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13880 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
13890 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
138a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
138b0 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
138c0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
138d0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
138e0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
138f0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
13900 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
13910 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
13920 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
13930 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
13940 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
13950 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
13960 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
13970 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
13980 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
13990 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
139a0 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
139b0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
139c0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
139d0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
139e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
139f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
13a00 20 61 64 64 72 3b 0a 20 20 73 74 72 75 63 74 20   addr;.  struct 
13a10 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
13a20 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49  unc;.  if( pAggI
13a30 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49  nfo->nFunc+pAggI
13a40 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20  nfo->nColumn==0 
13a50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
13a60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13a70 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
13a80 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  , 0, 0);.  for(i
13a90 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
13aa0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
13ab0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13ac0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13ad0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 41 67 67 49  _MemStore, pAggI
13ae0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
13af0 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
13b00 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
13b10 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
13b20 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
13b30 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
13b40 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13b50 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13b60 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 46 75 6e 63  _MemStore, pFunc
13b70 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
13b80 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
13b90 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
13ba0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
13bb0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
13bc0 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30  if( pE->pList==0
13bd0 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e   || pE->pList->n
13be0 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
13bf0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13c00 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
13c10 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74  INCT in aggregat
13c20 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77  e must be follow
13c30 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ed ".           
13c40 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f  "by an expressio
13c50 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  n");.        pFu
13c60 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
13c70 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
13c80 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
13c90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
13ca0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
13cb0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
13cc0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  st);.        sql
13cd0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
13ce0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
13cf0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
13d00 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13d20 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
13d30 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
13d40 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
13d50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13d60 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
13d70 61 64 64 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  addr, 1);.}../*.
13d80 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
13d90 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
13da0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
13db0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13dc0 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
13dd0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
13de0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
13df0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
13e00 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
13e10 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
13e20 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
13e30 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13e40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
13e50 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
13e60 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
13e70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
13e80 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
13e90 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
13ea0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
13eb0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
13ec0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71  r->pList;.    sq
13ed0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
13ee0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
13ef0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
13f00 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
13f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
13f30 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
13f40 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
13f50 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
13f60 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
13f70 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
13f80 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
13f90 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
13fa0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
13fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13fc0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
13fd0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
13fe0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
13ff0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
14000 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
14010 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
14020 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
14030 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
14040 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
14050 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
14060 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
14070 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
14080 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
14090 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
140a0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
140b0 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
140c0 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
140d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
140e0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
140f0 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
14100 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
14110 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
14120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14130 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
14140 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
14150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14160 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
14170 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
14180 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
14190 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
141a0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
141b0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
141c0 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
141d0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
141e0 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  t(v, pF->iDistin
141f0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
14200 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   2);.    }.    i
14210 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65  f( pF->pFunc->ne
14220 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
14230 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
14240 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
14250 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
14260 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
14270 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
14280 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
14290 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
142a0 6a 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  j<pList->nExpr; 
142b0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
142c0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
142d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
142e0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
142f0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
14300 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
14310 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
14320 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
14330 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
14340 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14350 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
14360 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
14370 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
14380 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
14390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
143a0 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p3(v, OP_AggStep
143b0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67  , pF->iMem, nArg
143c0 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75  , (void*)pF->pFu
143d0 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b  nc, P3_FUNCDEF);
143e0 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
143f0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
14400 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14410 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
14420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
14430 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
14440 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
14450 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
14460 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
14470 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14480 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
14490 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
144a0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
144b0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e  P_MemStore, pC->
144c0 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  iMem, 1);.  }.  
144d0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
144e0 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  Mode = 0;.}.../*
144f0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14500 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
14510 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14520 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
14530 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
14540 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
14550 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
14560 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
14570 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
14580 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
14590 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
145a0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
145b0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
145f0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
14600 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
14610 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
14620 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
14630 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
14640 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
14650 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
14660 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
14670 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
14680 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
14690 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
146a0 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   of table iParm.
146b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
146c0 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
146d0 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
146e0 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
146f0 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
14700 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
14710 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
14720 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
14730 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
14740 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
14750 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
14760 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
14770 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14780 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65   iParm.**.** The
14790 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20   table above is 
147a0 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64  incomplete.  Add
147b0 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61  itional eDist va
147c0 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65  lue have be adde
147d0 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20  d.** since this 
147e0 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74  comment was writ
147f0 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65  ten.  See the se
14800 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
14810 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  function for.** 
14820 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69  a complete listi
14830 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65  ng of the allowe
14840 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73  d values of eDes
14850 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e  t and their mean
14860 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ings..**.** This
14870 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
14880 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
14890 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
148a0 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
148b0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
148c0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
148d0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
148e0 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
148f0 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
14900 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
14910 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
14920 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
14930 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
14940 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
14950 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
14960 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
14970 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
14980 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
14990 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
149a0 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
149b0 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
149c0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
149d0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
149e0 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
149f0 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
14a00 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
14a10 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
14a20 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
14a30 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
14a40 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
14a50 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
14a60 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
14a70 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
14a80 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
14a90 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
14aa0 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
14ab0 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
14ac0 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
14ad0 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
14ae0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
14af0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
14b00 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   the pParent par
14b10 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ameter..**.**   
14b20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14b30 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78  1 JOIN (SELECT x
14b40 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
14b50 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20  t2) JOIN t3;.** 
14b60 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
14b70 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
14b80 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
14b90 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a  ___/        /.**
14ba0 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20       \          
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
14be0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
14bf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
14c00 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
14c10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a  ___________/.**.
14c20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14c30 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
14c40 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69  e outer query fi
14c50 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20  rst.   For that 
14c60 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74  call,.** pParent
14c70 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20   will be NULL.  
14c80 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65  During the proce
14c90 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ssing of the out
14ca0 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a  er query, this .
14cb0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
14cc0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
14cd0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73   to handle the s
14ce0 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68  ubquery.  For th
14cf0 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63  e recursive.** c
14d00 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c  all, pParent wil
14d10 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f  l point to the o
14d20 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63  uter query.  Bec
14d30 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72  ause the subquer
14d40 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f  y is.** the seco
14d50 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20  nd element in a 
14d60 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20  three-way join, 
14d70 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61  the parentTab pa
14d80 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20  rameter will.** 
14d90 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61  be 1 (the 2nd va
14da0 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78  lue of a 0-index
14db0 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e  ed array.).*/.in
14dc0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
14dd0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14de0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
14df0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
14e00 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14e20 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14e30 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
14e40 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e60 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
14e70 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
14e80 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
14e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
14ea0 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79  arameter used by
14eb0 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f   the eDest dispo
14ec0 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
14ed0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c  Select *pParent,
14ee0 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
14ef0 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69  r SELECT for whi
14f00 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62  ch this is a sub
14f10 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  -query */.  int 
14f20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20  parentTab,      
14f30 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
14f40 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20  Parent->pSrc of 
14f50 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
14f60 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  int *pParentAgg,
14f70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14f80 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61  f pParent uses a
14f90 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14fa0 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ns */.  char *af
14fb0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f              /
14fc0 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
14fd0 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
14fe0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
14ff0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
15000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15010 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
15020 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
15030 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
15040 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
15050 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
15060 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
15070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
15080 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
15090 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
150a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
150b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
150c0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
150d0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
150e0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
150f0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
15100 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
15110 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
15120 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
15130 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
15140 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
15150 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
15160 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
15170 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
15180 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
15190 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
151a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
151b0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
151c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
151d0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
151e0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
151f0 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
15200 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
15210 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
15220 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
15230 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
15240 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
15250 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
15260 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
15270 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
15280 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
15290 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
152a0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
152b0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
152c0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
152d0 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
152e0 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
152f0 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
15300 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
15310 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
15320 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
15330 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
15340 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
15350 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74  f an OP_OpenVirt
15360 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ual instruction 
15370 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
15380 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
15390 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
153a0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
153b0 72 69 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 73  ries */..  if( s
153c0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
153d0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
153e0 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
153f0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
15400 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15410 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
15420 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
15430 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
15440 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
15450 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
15460 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  fo));..#ifndef S
15470 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
15480 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
15490 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
154a0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
154b0 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
154c0 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
154d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
154e0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
154f0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
15500 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
15510 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  ct *pLoop;.     
15520 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
15530 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
15540 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
15550 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
15560 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
15570 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
15580 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
15590 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
155a0 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20   iParm, aff);.  
155b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72 64  }.#endif..  pOrd
155c0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
155d0 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  By;.  if( Ignora
155e0 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
155f0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ) ){.    p->pOrd
15600 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  erBy = 0;.  }.  
15610 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
15620 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
15630 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f   p, 0) ){.    go
15640 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
15650 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79   }.  p->pOrderBy
15660 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
15670 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
15680 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
15690 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
156a0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
156b0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
156c0 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
156d0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
156e0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
156f0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
15700 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67  >pHaving;.  isAg
15710 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
15720 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
15730 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45  isDistinct;.  pE
15740 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
15750 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
15760 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
15770 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
15780 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
15790 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
157a0 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
157b0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
157c0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
157d0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
157e0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
157f0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15800 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
15810 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
15820 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
15830 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
15840 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
15850 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
15860 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
15870 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 44   */.  assert( eD
15880 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
15890 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
158a0 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==1 );.#ifndef S
158b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
158c0 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74  ERY.  if( (eDest
158d0 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
158e0 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
158f0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
15900 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15910 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15920 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
15930 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
15940 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
15950 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
15960 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
15970 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
15980 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
15990 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
159a0 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
159b0 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
159c0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
159d0 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
159e0 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
159f0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
15a00 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
15a10 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
15a20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
15a30 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15a40 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
15a50 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15a60 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
15a70 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
15a80 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
15a90 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
15aa0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
15ab0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
15ac0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
15ad0 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
15ae0 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
15af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
15b00 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
15b10 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
15b20 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
15b30 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
15b40 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
15b50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
15b60 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
15b70 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
15b80 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
15b90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15ba0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
15bb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15bc0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
15bd0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
15be0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
15bf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15c00 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
15c10 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
15c20 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
15c30 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
15c40 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
15c50 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
15c60 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  ];..    if( pIte
15c70 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
15c80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15c90 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
15ca0 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
15cb0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
15cc0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
15cd0 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
15ce0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
15cf0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
15d00 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
15d10 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
15d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
15d30 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
15d40 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
15d50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15d60 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
15d70 65 6c 65 63 74 2c 20 53 52 54 5f 56 69 72 74 75  elect, SRT_Virtu
15d80 61 6c 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20  alTab, .        
15d90 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
15da0 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
15db0 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
15dc0 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
15dd0 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
15de0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
15df0 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
15e00 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
15e10 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
15e20 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
15e30 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
15e40 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
15e50 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
15e60 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
15e70 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
15e80 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
15e90 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
15ea0 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
15eb0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
15ec0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
15ed0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
15ee0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
15ef0 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
15f00 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
15f10 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
15f20 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
15f30 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
15f40 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
15f50 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
15f60 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
15f70 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
15f80 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
15f90 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
15fb0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
15fc0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
15fd0 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
15fe0 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
15ff0 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
16000 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
16010 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
16020 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
16030 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
16040 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16050 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
16060 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
16070 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
16080 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
16090 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
160a0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
160b0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
160c0 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
160d0 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
160e0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
160f0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
16100 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
16110 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
16120 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
16130 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
16140 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
16150 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
16160 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
16170 65 63 69 66 69 65 64 20 61 6e 64 20 63 72 65 61  ecified and crea
16180 74 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  te a sorting ind
16190 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ex..  **.  ** Th
161a0 69 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  is sorting index
161b0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
161c0 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
161d0 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
161e0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
161f0 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
16200 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
16210 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
16220 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69  e.  ** OP_OpenVi
16230 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
16240 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
16250 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
16260 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
16270 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
16280 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
16290 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
162a0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
162b0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
162c0 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
162d0 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
162e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
162f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72  derBy ){.    str
16300 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16310 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65  m *pTerm;.    Ke
16320 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16330 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  .    for(i=0, pT
16340 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  erm=pOrderBy->a;
16350 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
16360 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  pr; i++, pTerm++
16370 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
16380 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  rm->zName ){.   
16390 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70       pTerm->pExp
163a0 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
163b0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
163c0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a  pParse, pTerm->z
163d0 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Name, -1);.     
163e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
163f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
16400 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
16410 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
16420 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
16430 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
16440 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
16450 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
16460 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
16470 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
16480 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
16490 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
164a0 64 65 78 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  dex =.       sql
164b0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
164c0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
164d0 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
164e0 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
164f0 70 72 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20  pr+2, .         
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16510 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
16520 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
16530 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
16540 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
16550 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
16560 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
16570 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
16580 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
16590 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
165a0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
165b0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
165c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
165d0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
165e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
165f0 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54  st==SRT_VirtualT
16600 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
16610 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16620 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50  _OpenVirtual, iP
16630 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
16640 70 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  pr);.  }...  /* 
16650 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
16660 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55  emory cell to NU
16670 4c 4c 20 66 6f 72 20 53 52 54 5f 4d 65 6d 20 6f  LL for SRT_Mem o
16680 72 20 30 20 66 6f 72 20 53 52 54 5f 45 78 69 73  r 0 for SRT_Exis
16690 74 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ts.  */.  if( eD
166a0 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
166b0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
166c0 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
166d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 65 44 65  VdbeAddOp(v, eDe
166e0 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 3f 20 4f 50  st==SRT_Mem ? OP
166f0 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 49 6e 74 65 67  _Null : OP_Integ
16700 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
16710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16720 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
16730 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
16740 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
16750 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
16760 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
16770 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
16780 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
16790 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
167a0 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69  yInfo;.    disti
167b0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
167c0 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
167d0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
167e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
167f0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
16800 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16810 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
16820 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
16830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16840 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
16850 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
16860 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
16870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
16880 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
16890 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
168a0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
168b0 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
168c0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
168d0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
168e0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
168f0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
16900 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
16910 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
16920 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
16930 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
16940 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
16950 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
16960 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
16970 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
16980 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  &pOrderBy);.    
16990 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
169a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
169b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
169c0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
169d0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
169e0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 56 69 72  prior OP_OpenVir
169f0 74 75 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  tual .    ** ins
16a00 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
16a10 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
16a20 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
16a30 74 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  the OP_OpenVirtu
16a40 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
16a50 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
16a60 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
16a70 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
16a80 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
16a90 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69     uncreateSorti
16aa0 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
16ab0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
16ac0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
16ad0 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nVirt[2] = -1;. 
16ae0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
16af0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
16b00 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a  ner loop.    */.
16b10 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
16b20 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
16b30 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
16b40 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
16b50 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69  iParm, pWInfo->i
16b80 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
16b90 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29  ->iBreak, aff) )
16ba0 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
16bb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16bc0 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
16bd0 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
16be0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
16bf0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
16c00 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
16c10 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
16c20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
16c30 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
16c40 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
16c50 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
16c60 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
16c70 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
16c80 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
16c90 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
16ca0 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
16cb0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
16cc0 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
16cd0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
16ce0 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
16cf0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
16d00 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
16d10 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
16d20 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
16d30 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
16d40 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
16d50 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
16d60 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
16d70 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
16da0 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
16db0 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
16dc0 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
16dd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
16de0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
16df0 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
16e00 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
16e10 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
16e20 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
16e30 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
16e40 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
16e50 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
16e60 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
16e70 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
16e80 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
16e90 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
16ea0 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20   hold addresses 
16eb0 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61  or labels for pa
16ec0 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  rts of the.    *
16ed0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
16ee0 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65  e program we are
16ef0 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65   putting togethe
16f00 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
16f10 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20  rOutputRow;     
16f20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
16f30 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
16f40 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
16f50 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
16f60 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20  rSetAbort;      
16f70 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
16f80 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
16f90 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  n */.    int add
16fa0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b  rInitializeLoop;
16fb0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
16fc0 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
16fd0 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  es the input loo
16fe0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
16ff0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20  rTopOfLoop;     
17000 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
17010 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
17020 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79   int addrGroupBy
17030 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65  Change;  /* Code
17040 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
17050 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
17060 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  m changes */.   
17070 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73   int addrProcess
17080 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65  Row;     /* Code
17090 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
170a0 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a  ngle input row *
170b0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
170c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
170d0 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63   End of all proc
170e0 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  essing */.    in
170f0 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
17100 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  ;     /* The OP_
17110 4f 70 65 6e 56 69 72 74 75 61 6c 20 66 6f 72 20  OpenVirtual for 
17120 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
17130 78 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  x */..    addrEn
17140 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
17150 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
17160 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
17170 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
17180 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
17190 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
171a0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
171b0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
171c0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
171d0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
171e0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
171f0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
17200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
17210 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
17220 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
17230 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
17240 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
17250 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
17260 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
17270 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
17280 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
17290 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
172a0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
172b0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
172c0 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
172d0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
172e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
172f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
17300 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
17310 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
17320 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
17330 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
17340 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
17350 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
17360 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17370 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
17380 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
17390 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
173a0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
173b0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
173c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
173d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
173e0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
173f0 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
17400 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
17410 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
17420 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
17430 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
17440 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
17450 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
17460 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
17470 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
17480 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
17490 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
174a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
174b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
174c0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
174d0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
174e0 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
174f0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
17500 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
17510 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
17520 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
17530 63 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67 72  complex tha aggr
17540 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
17550 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
17560 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
17570 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
17580 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
17590 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
175a0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
175b0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
175c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
175d0 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65  e labels that we
175e0 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67   will be needing
175f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a  .      */.     .
17600 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61        addrInitia
17610 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  lizeLoop = sqlit
17620 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17630 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72  v);.      addrGr
17640 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71  oupByChange = sq
17650 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17660 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  el(v);.      add
17670 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71  rProcessRow = sq
17680 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17690 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  el(v);..      /*
176a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
176b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
176c0 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
176d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
176e0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
176f0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
17700 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
17710 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
17720 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
17730 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
17740 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
17750 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56 69 72  all, the OpenVir
17760 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  tual instruction
17770 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
17780 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
17790 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
177a0 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
177b0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
177c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
177d0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
177e0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
177f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
17800 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
17810 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20  drSortingIdx =. 
17820 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17830 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
17840 65 6e 56 69 72 74 75 61 6c 2c 20 73 41 67 67 49  enVirtual, sAggI
17850 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  nfo.sortingIdx,.
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17870 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
17880 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
17890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
178a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
178b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
178c0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
178d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
178e0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
178f0 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
17900 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
17910 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
17920 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
17930 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Flag = pParse->n
17940 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62  Mem++;.      iAb
17950 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65  ortFlag = pParse
17960 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
17970 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
17980 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
17990 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
179a0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
179b0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
179c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
179d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
179e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
179f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a00 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
17a10 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
17a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17a30 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
17a40 72 65 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  re, iAbortFlag, 
17a50 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
17a60 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
17a70 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 55 73 65 46  _MemStore, iUseF
17a80 6c 61 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  lag, 1);.      s
17a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
17aa0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
17ab0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17ac0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17ad0 4d 65 6d 53 74 6f 72 65 2c 20 69 41 4d 65 6d 2c  MemStore, iAMem,
17ae0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
17af0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
17b00 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
17b10 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
17b20 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
17b30 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
17b40 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
17b50 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
17b60 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
17b70 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
17b80 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
17b90 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
17ba0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
17bb0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
17bc0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
17bd0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
17be0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17bf0 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
17c00 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
17c10 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
17c20 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
17c30 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
17c40 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
17c50 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
17c60 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
17c70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
17c80 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
17c90 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
17ca0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
17cb0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
17cc0 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
17cd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17ce0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
17cf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17d00 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
17d10 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 30 29  , iAbortFlag, 0)
17d20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17d30 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
17d40 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
17d50 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
17d60 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
17d70 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17d90 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
17da0 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  mPos, iUseFlag, 
17db0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
17dc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17dd0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
17de0 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
17df0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
17e00 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
17e10 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
17e20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
17e30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17e40 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
17e50 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
17e60 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31  drOutputRow+1, 1
17e70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17e80 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
17e90 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
17ea0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
17eb0 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
17ee0 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
17f10 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
17f20 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a  SetAbort, aff);.
17f30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17f40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
17f50 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
17f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17f70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
17f80 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  turn, 0, 0);..  
17f90 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
17fa0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
17fb0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
17fc0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
17fd0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
17fe0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
17ff0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
18000 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
18010 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
18020 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
18030 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
18040 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
18050 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
18060 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
18070 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
18080 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
18090 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
180a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
180b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
180c0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69  Label(v, addrIni
180d0 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20  tializeLoop);.  
180e0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
180f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
18100 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
18110 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
18120 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  By);.      if( p
18130 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
18140 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
18150 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
18160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
18170 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
18180 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
18190 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
181a0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
181b0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
181c0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
181d0 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  he OP_OpenVirtua
181e0 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
181f0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
18200 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
18210 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
18220 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
18230 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
18240 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
18250 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
18260 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
18270 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
18280 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
18290 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
182a0 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
182b0 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
182c0 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
182d0 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
182e0 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
182f0 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
18300 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
18310 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
18320 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
18330 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
18340 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
18350 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
18360 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
18370 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
18380 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
18390 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
183a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
183b0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
183c0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
183d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
183e0 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  Op(v, OP_Sequenc
183f0 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
18400 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
18410 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79      j = pGroupBy
18420 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20  ->nExpr+1;.     
18430 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
18440 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
18450 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
18460 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
18470 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
18480 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
18490 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
184a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
184b0 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  j ) continue;.  
184c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
184d0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
184e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
184f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18500 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69  P_Rowid, pCol->i
18510 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
18520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18540 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
18550 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
18560 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  ble, pCol->iColu
18570 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mn);.          }
18580 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
18590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
185a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
185b0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
185c0 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20  ord, j, 0);.    
185d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
185e0 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
185f0 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
18600 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
18610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
18620 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
18630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18640 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
18650 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
18660 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
18670 64 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  d);.        sAgg
18680 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
18690 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dx = 1;.      }.
186a0 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
186b0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
186c0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
186d0 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
186e0 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
186f0 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
18700 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
18710 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
18720 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
18730 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
18740 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
18750 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
18760 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
18770 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
18780 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
18790 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
187a0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
187b0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
187c0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
187d0 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
187e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
187f0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
18800 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
18810 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
18820 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
18830 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
18840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18850 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
18860 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
18870 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20  ngIdx, j);.     
18880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18890 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
188a0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
188b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
188c0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
188d0 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
188e0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
188f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18900 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
18910 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a  emStore, iBMem+j
18920 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  , j<pGroupBy->nE
18930 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xpr-1);.      }.
18940 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f        for(j=pGro
18950 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a  upBy->nExpr-1; j
18960 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
18970 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42     if( j<pGroupB
18980 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  y->nExpr-1 ){.  
18990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
189a0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
189b0 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c  emLoad, iBMem+j,
189c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
189d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
189e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
189f0 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20  mLoad, iAMem+j, 
18a00 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
18a10 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j==0 ){.        
18a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18a30 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20  Op(v, OP_Eq, 0, 
18a40 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b  addrProcessRow);
18a50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18a70 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18a80 5f 4e 65 2c 20 30 78 31 30 30 2c 20 61 64 64 72  _Ne, 0x100, addr
18a90 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
18aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18ac0 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f  ngeP3(v, -1, (vo
18ad0 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  id*)pKeyInfo->aC
18ae0 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53  oll[j], P3_COLLS
18af0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  EQ);.      }..  
18b00 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
18b10 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
18b20 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
18b30 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
18b40 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e      ** Change in
18b50 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
18b60 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
18b70 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
18b80 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
18b90 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
18ba0 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
18bb0 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
18bc0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18bd0 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
18be0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
18bf0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
18c00 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
18c10 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
18c20 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
18c30 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
18c40 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
18c50 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
18c60 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
18c70 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
18c80 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
18c90 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
18ca0 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
18cb0 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
18cc0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
18cd0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18ce0 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68  v, addrGroupByCh
18cf0 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  ange);.      for
18d00 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
18d10 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
18d20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18d30 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
18d40 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20  mLoad, iBMem+j, 
18d50 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
18d60 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18d70 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 41 4d  OP_MemStore, iAM
18d80 65 6d 2b 6a 2c 20 31 29 3b 0a 20 20 20 20 20 20  em+j, 1);.      
18d90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
18da0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
18db0 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
18dc0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
18dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18de0 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
18df0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
18e00 45 6e 64 29 3b 0a 20 20 20 20 20 20 72 65 73 65  End);.      rese
18e10 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
18e20 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
18e30 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
18e40 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
18e50 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
18e60 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
18e70 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
18e80 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
18e90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
18ea0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18eb0 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63  abel(v, addrProc
18ec0 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75  essRow);.      u
18ed0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
18ee0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
18ef0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
18f00 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18f10 50 5f 4d 65 6d 49 6e 63 72 2c 20 69 55 73 65 46  P_MemIncr, iUseF
18f20 6c 61 67 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  lag, 0);..      
18f30 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
18f40 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
18f50 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
18f60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
18f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18f80 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
18f90 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
18fa0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
18fb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18fc0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
18fd0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
18fe0 20 20 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72       uncreateSor
18ff0 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
19000 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
19010 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
19020 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
19030 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
19040 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
19050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19060 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
19070 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
19080 77 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d  w);.      .    }
19090 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
190a0 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  By */.    else {
190b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
190c0 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
190d0 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
190e0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
190f0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
19100 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
19110 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
19120 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
19130 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
19140 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
19150 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
19160 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
19170 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
19180 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  o);.      pWInfo
19190 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
191a0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
191b0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
191c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
191d0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
191e0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
191f0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
19200 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
19210 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
19220 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
19230 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  fo);.      final
19240 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
19250 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
19260 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  o);.      pOrder
19270 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
19280 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
19290 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
192a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
192b0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
192c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
192d0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
192e0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
192f0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
19300 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  0, -1, .        
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44                eD
19320 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72  est, iParm, addr
19330 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66  End, addrEnd, af
19340 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  f);.    }.    sq
19350 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
19360 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
19370 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
19380 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
19390 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  uery */..  /* If
193a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
193b0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
193c0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
193d0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
193e0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
193f0 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
19400 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
19410 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
19420 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
19430 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
19440 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
19450 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
19460 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  arm);.  }..#ifnd
19470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19480 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20  UBQUERY.  /* If 
19490 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
194a0 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
194b0 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
194c0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
194d0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
194e0 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20  ble.  So delete 
194f0 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72  the subquery str
19500 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
19510 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70  parent.  ** to p
19520 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71  revent this subq
19530 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
19540 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
19550 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
19560 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
19570 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
19580 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
19590 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
195a0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
195b0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
195c0 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
195d0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
195e0 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
195f0 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
19600 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
19610 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70  Delete(p);.    p
19620 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
19630 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
19640 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  ct = 0;.  }.#end
19650 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  if..  /* The SEL
19660 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
19670 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
19680 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
19690 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
196a0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
196b0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
196c0 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
196d0 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
196e0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
196f0 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
19700 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
19710 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
19720 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
19730 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
19740 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67   sqliteFree(sAgg
19750 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
19760 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66  liteFree(sAggInf
19770 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
19780 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.