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

Artifact 48d3ecfb1bf271f0540d3534bdfd8487d6a4b9ee:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 38 38  select.c,v 1.288
0200: 20 32 30 30 36 2f 30 31 2f 30 38 20 31 38 3a 31   2006/01/08 18:1
0210: 30 3a 31 38 20 64 72 68 20 45 78 70 20 24 0a 2a  0:18 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0820: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
0830: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0840: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
0850: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0860: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20  addrOpenVirt[2] 
0870: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0880: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0890: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
08a0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
08b0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
08c0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
08d0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
08e0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
08f0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0900: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0910: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0920: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0930: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0940: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0950: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0960: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0970: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0980: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0990: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
09a0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
09b0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
09c0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
09d0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
09e0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
09f0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0a00: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0a10: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0a20: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0a30: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0a40: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0a50: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0a60: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a80: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a90: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0aa0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0ab0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0ac0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0ad0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0ae0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0af0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0b00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b10: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0b20: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0b30: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0b40: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0b50: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0b60: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b70: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b80: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b90: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0ba0: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0bb0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0bc0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0bd0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0be0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0bf0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0c00: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0c10: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0c20: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c30: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0c40: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0c50: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0c60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0c70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0c80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0c90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0ca0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0cb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0cc0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0cd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0ce0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
0cf0: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
0d00: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
0d10: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
0d20: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
0d30: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
0d40: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
0d50: 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  r*)p->z, keyword
0d60: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
0d70: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
0d80: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
0d90: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
0da0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
0db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0dc0: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
0dd0: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0de0: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
0df0: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
0e00: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
0e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0e20: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
0e30: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
0e40: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
0e50: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
0e60: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
0e70: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
0e80: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
0e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
0ea0: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
0eb0: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
0ec0: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0ed0: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
0ee0: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
0ef0: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
0f00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0f10: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
0f20: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0f30: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
0f40: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
0f50: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
0f60: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
0f70: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
0f90: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
0fa0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0fb0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0fc0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
0fd0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
0fe0: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
0ff0: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
1000: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1010: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1020: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1040: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1050: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1060: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1070: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1080: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1090: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
10a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
10b0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
10c0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
10d0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
10e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1100: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1110: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1120: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1130: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1150: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
1160: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
1170: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1180: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1190: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
11a0: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
11b0: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
11c0: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28   *z){.  p->z = (
11d0: 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20  u8*)z;.  p->n = 
11e0: 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20  z ? strlen(z) : 
11f0: 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  0;.  p->dyn = 0;
1200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1210: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
1220: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
1230: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1240: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
1250: 73 74 61 74 69 63 20 45 78 70 72 20 2a 63 72 65  static Expr *cre
1260: 61 74 65 49 64 45 78 70 72 28 63 6f 6e 73 74 20  ateIdExpr(const 
1270: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1280: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73  Token dummy;.  s
1290: 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20  etToken(&dummy, 
12a0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
12b0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
12c0: 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79  ID, 0, 0, &dummy
12d0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
12e0: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
12f0: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
1300: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
1310: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
1320: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
1330: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
1340: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
1350: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1360: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1370: 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20  reTerm(.  const 
1380: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20  char *zCol,     
1390: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13a0: 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  e column */.  co
13b0: 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31  nst Table *pTab1
13c0: 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ,      /* First 
13d0: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  table */.  const
13e0: 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20   char *zAlias1, 
13f0: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
1400: 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d   first table.  M
1410: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1420: 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61  const Table *pTa
1430: 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f  b2,      /* Seco
1440: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  nd table */.  co
1450: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
1460: 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  2,     /* Alias 
1470: 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65  for second table
1480: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1490: 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a 6f  /.  int iRightJo
14a0: 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a 20  inTable,     /* 
14b0: 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
14c0: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
14d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78  */.  Expr **ppEx
14e0: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
14f0: 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69 74   Add the equalit
1500: 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65  y term to this e
1510: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
1520: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1530: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1540: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1550: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1560: 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 63 72  pE;..  pE1a = cr
1570: 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29  eateIdExpr(zCol)
1580: 3b 0a 20 20 70 45 32 61 20 3d 20 63 72 65 61 74  ;.  pE2a = creat
1590: 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20  eIdExpr(zCol);. 
15a0: 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20   if( zAlias1==0 
15b0: 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d  ){.    zAlias1 =
15c0: 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab1->zName;. 
15d0: 20 7d 0a 20 20 70 45 31 62 20 3d 20 63 72 65 61   }.  pE1b = crea
15e0: 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 31  teIdExpr(zAlias1
15f0: 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32  );.  if( zAlias2
1600: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61  ==0 ){.    zAlia
1610: 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d  s2 = pTab2->zNam
1620: 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20  e;.  }.  pE2b = 
1630: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c  createIdExpr(zAl
1640: 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20  ias2);.  pE1c = 
1650: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
1660: 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20  OT, pE1b, pE1a, 
1670: 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c  0);.  pE2c = sql
1680: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
1690: 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b   pE2b, pE2a, 0);
16a0: 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45  .  pE = sqlite3E
16b0: 78 70 72 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c  xpr(TK_EQ, pE1c,
16c0: 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 45 78 70   pE2c, 0);.  Exp
16d0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
16e0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
16f0: 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54   pE->iRightJoinT
1700: 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69  able = iRightJoi
1710: 6e 54 61 62 6c 65 3b 0a 20 20 2a 70 70 45 78 70  nTable;.  *ppExp
1720: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
1730: 6e 64 28 2a 70 70 45 78 70 72 2c 20 70 45 29 3b  nd(*ppExpr, pE);
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1750: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
1760: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
1770: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
1780: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1790: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
17a0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
17b0: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
17c0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
17d0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
17e0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
17f0: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
1800: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
1810: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1820: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
1830: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1840: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
1850: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
1860: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
1870: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
1880: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
1890: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
18a0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
18b0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
18c0: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
18d0: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
18e0: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
18f0: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
1900: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
1910: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
1920: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
1930: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1940: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
1950: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
1960: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
1970: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
1980: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
1990: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
19a0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
19b0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
19c0: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
19d0: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
19e0: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
19f0: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
1a00: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
1a10: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1a20: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
1a30: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
1a40: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
1a50: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
1a60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
1a70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1a80: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1a90: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
1aa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
1ab0: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
1ac0: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
1ad0: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
1ae0: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
1af0: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
1b00: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
1b10: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
1b20: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
1b30: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
1b40: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
1b50: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
1b60: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
1b70: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
1b80: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
1b90: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
1ba0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
1bb0: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
1bc0: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
1bd0: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
1be0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
1bf0: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
1c00: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
1c10: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
1c20: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
1c30: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
1c40: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
1c50: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
1c60: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69  mJoin);.    p->i
1c70: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c80: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74   iTable;.    set
1c90: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
1ca0: 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, iTable);.    
1cb0: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
1cc0: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
1cd0: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
1ce0: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
1cf0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
1d00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1d10: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
1d20: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
1d30: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
1d40: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
1d50: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
1d60: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
1d70: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
1d80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1d90: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ms..**.** The te
1da0: 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  rms of a FROM cl
1db0: 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e  ause are contain
1dc0: 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74  ed in the Select
1dd0: 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e  .pSrc structure.
1de0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73  .** The left mos
1df0: 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66  t table is the f
1e00: 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65  irst entry in Se
1e10: 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20  lect.pSrc.  The 
1e20: 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61  right-most.** ta
1e30: 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20  ble is the last 
1e40: 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e  entry.  The join
1e50: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c   operator is hel
1e60: 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  d in the entry t
1e70: 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20  o.** the left.  
1e80: 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e  Thus entry 0 con
1e90: 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f  tains the join o
1ea0: 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  perator for the 
1eb0: 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  join between.** 
1ec0: 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e  entries 0 and 1.
1ed0: 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e    Any ON or USIN
1ee0: 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69  G clauses associ
1ef0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f  ated with the jo
1f00: 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61  in are.** also a
1f10: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1f20: 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  eft entry..**.**
1f30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1f40: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1f50: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
1f60: 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ntered..*/.stati
1f70: 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63  c int sqliteProc
1f80: 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70  essJoin(Parse *p
1f90: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1fa0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1fb0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1fc0: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c       /* All tabl
1fd0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
1fe0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
1ff0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2010: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2020: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2030: 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20  item *pLeft;    
2040: 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62   /* Left table b
2050: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
2060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2070: 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20  item *pRight;   
2080: 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20   /* Right table 
2090: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
20a0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
20b0: 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53  c;.  pLeft = &pS
20c0: 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67  rc->a[0];.  pRig
20d0: 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a  ht = &pLeft[1];.
20e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
20f0: 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20  c->nSrc-1; i++, 
2100: 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b  pRight++, pLeft+
2110: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2120: 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d  LeftTab = pLeft-
2130: 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65  >pTab;.    Table
2140: 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52   *pRightTab = pR
2150: 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  ight->pTab;..   
2160: 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30   if( pLeftTab==0
2170: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
2180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2190: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
21a0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
21b0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
21c0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
21d0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
21e0: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
21f0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2200: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2210: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66   */.    if( pLef
2220: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
2230: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
2240: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e    if( pLeft->pOn
2250: 20 7c 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e   || pLeft->pUsin
2260: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
2270: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2280: 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20  rse, "a NATURAL 
2290: 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76  join may not hav
22a0: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
22b0: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
22c0: 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20  lause", 0);.    
22d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
22f0: 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d  j=0; j<pLeftTab-
2300: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
2310: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2320: 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f   = pLeftTab->aCo
2330: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
2340: 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e      if( columnIn
2350: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
2360: 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
2370: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2380: 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  rm(zName, pLeftT
2390: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
23a0: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
23d0: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
2400: 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e  t->iCursor, &p->
2410: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
2420: 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20     .        }.  
2430: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2440: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
2450: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
2460: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2470: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
2480: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f     if( pLeft->pO
2490: 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70 55 73 69  n && pLeft->pUsi
24a0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
24b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
24c0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
24d0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
24e0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
24f0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2500: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
2510: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2520: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
2530: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
2540: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2550: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
2560: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
2570: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
2580: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2590: 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20  eft->pOn ){.    
25a0: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 4c    setJoinExpr(pL
25b0: 65 66 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  eft->pOn, pRight
25c0: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
25d0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
25e0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e  lite3ExprAnd(p->
25f0: 70 57 68 65 72 65 2c 20 70 4c 65 66 74 2d 3e 70  pWhere, pLeft->p
2600: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74  On);.      pLeft
2610: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
2620: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2630: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
2640: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2650: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
2660: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
2670: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2680: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
2690: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
26a0: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
26b0: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
26c0: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
26d0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
26e0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
26f0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
2700: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
2710: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
2720: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
2730: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
2740: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
2750: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
2760: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
2770: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
2780: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
2790: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
27a0: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
27b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
27c0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
27d0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
27e0: 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 3b  = pLeft->pUsing;
27f0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2800: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
2810: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
2820: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d   *zName = pList-
2830: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
2840: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
2850: 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a  ndex(pLeftTab, z
2860: 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d  Name)<0 || colum
2870: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2880: 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20  , zName)<0 ){.  
2890: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28b0: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
28c0: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
28d0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
28e0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
28f0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
2900: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2910: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2930: 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61  addWhereTerm(zNa
2940: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
2950: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2980: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
2990: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
29c0: 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
29d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
29f0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
2a00: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
2a10: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
2a20: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
2a30: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
2a40: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2a50: 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  e(Select *p){.  
2a60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2a70: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  n;.  sqlite3Expr
2a80: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
2a90: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
2aa0: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
2ab0: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
2ac0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2ad0: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
2ae0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2af0: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
2b00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2b10: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
2b20: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b30: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
2b40: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
2b50: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
2b60: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
2b70: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
2b80: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
2b90: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
2ba0: 66 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65  ffset);.  sqlite
2bb0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Free(p);.}../*.*
2bc0: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e  * Insert code in
2bd0: 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c  to "v" that will
2be0: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
2bf0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
2c00: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f  he.** stack into
2c10: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
2c20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
2c30: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
2c40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2c50: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
2c60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
2c70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2c80: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
2c90: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53  BY clause */.  S
2ca0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
2cb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
2cc0: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
2cd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
2ce0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2cf0: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  dbe;.  sqlite3Ex
2d00: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2d10: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
2d20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65  ddOp(v, OP_Seque
2d40: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
2d50: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73  ECursor, 0);.  s
2d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2d70: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64  v, OP_Pull, pOrd
2d80: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c  erBy->nExpr + 1,
2d90: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2da0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
2db0: 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72  keRecord, pOrder
2dc0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30  By->nExpr + 2, 0
2dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2de0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
2df0: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
2e00: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
2e10: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
2e20: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
2e30: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
2e40: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
2e50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2e60: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
2e70: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31  Select->iLimit+1
2e80: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2e90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2ea0: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 53  _MemIncr, -1, pS
2eb0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 29  elect->iLimit+1)
2ec0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
2ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2ee0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
2ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f00: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2f10: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
2f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f30: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
2f40: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
2f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f60: 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  Op(v, OP_Delete,
2f70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
2f80: 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  sor, 0);.    sql
2f90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2fa0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
2fb0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
2fc0: 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = -1;.  }.}../*.
2fd0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2fe0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2ff0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3000: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3010: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3020: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3030: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3040: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3050: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3060: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3070: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3080: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3090: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
30a0: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
30b0: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ent record */.  
30c0: 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20  int nPop        
30d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
30e0: 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63  imes to pop stac
30f0: 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a  k when jumping *
3100: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
3110: 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e  ffset>=0 && iCon
3120: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3130: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3150: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
3160: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3170: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3190: 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f  _IfMemNeg, p->iO
31a0: 66 66 73 65 74 2c 20 61 64 64 72 29 3b 0a 20 20  ffset, addr);.  
31b0: 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a    if( nPop>0 ){.
31c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
31e0: 2c 20 6e 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20  , nPop, 0);.    
31f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
3200: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
3210: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3220: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3230: 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 4f 46  t((v, "# skip OF
3240: 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b  FSET records"));
3250: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3260: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3270: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3280: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
3290: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
32a0: 20 73 75 72 65 20 74 68 65 20 74 6f 70 20 4e 20   sure the top N 
32b0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a  elements of the.
32c0: 2a 2a 20 73 74 61 63 6b 20 61 72 65 20 64 69 73  ** stack are dis
32d0: 74 69 6e 63 74 2e 20 20 69 54 61 62 20 69 73 20  tinct.  iTab is 
32e0: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
32f0: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
3300: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
3310: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
3320: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
3330: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
3340: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
3350: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
3360: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
3370: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
3380: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
3390: 61 6e 64 20 74 68 65 20 4b 20 76 61 6c 75 65 73  and the K values
33a0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
33b0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
33c0: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
33d0: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
33e0: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
33f0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
3400: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
3410: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
3420: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
3430: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  is VM */.  int i
3440: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
3450: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
3460: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
3470: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
3480: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
3490: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
34a0: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
34b0: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
34c0: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
34d0: 2a 20 54 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  * The top N elem
34e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 74 61 63  ents of the stac
34f0: 6b 20 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e  k must be distin
3500: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4b 20 20 20  ct */.  int K   
3510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
3520: 70 20 4b 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  p K elements fro
3530: 6d 20 74 68 65 20 73 74 61 63 6b 20 69 66 20 69  m the stack if i
3540: 6e 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a  ndistinct */.){.
3550: 23 69 66 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  #if NULL_ALWAYS_
3560: 44 49 53 54 49 4e 43 54 0a 20 20 73 71 6c 69 74  DISTINCT.  sqlit
3570: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3580: 50 5f 49 73 4e 75 6c 6c 2c 20 2d 4e 2c 20 73 71  P_IsNull, -N, sq
3590: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
35a0: 41 64 64 72 28 76 29 2b 36 29 3b 0a 23 65 6e 64  Addr(v)+6);.#end
35b0: 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
35c0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
35d0: 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a  Record, -N, 0);.
35e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35f0: 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63  Op(v, OP_Distinc
3600: 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65 33  t, iTab, sqlite3
3610: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3620: 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  v)+3);.  sqlite3
3630: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3640: 50 6f 70 2c 20 4b 2c 20 30 29 3b 0a 20 20 73 71  Pop, K, 0);.  sq
3650: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3660: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
3670: 64 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64 62  drRepeat);.  Vdb
3680: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
3690: 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74 20  skip indistinct 
36a0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73 71  records"));.  sq
36b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
36c0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
36d0: 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  iTab, 0);.}.../*
36e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36f0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
3700: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
3710: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
3720: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
3730: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
3740: 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e  cTab and nColumn
3750: 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20   are both zero, 
3760: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
3770: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
3780: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
3790: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
37a0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
37b0: 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e  ow.  If nColumn>
37c0: 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69  0.** then data i
37d0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
37e0: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
37f0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20  is used only to 
3800: 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  get the.** datat
3810: 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  ypes for each co
3820: 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
3830: 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  int selectInnerL
3840: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
3850: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
3860: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
3870: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
3880: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
3890: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
38a0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
38b0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
38c0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
38d0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c  List,       /* L
38e0: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65  ist of values be
38f0: 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f  ing extracted */
3900: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
3910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
3920: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
3930: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
3940: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20   nColumn,       
3950: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3960: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
3970: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f   source table */
3980: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
3990: 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66  derBy,     /* If
39a0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20   not NULL, sort 
39b0: 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68  results using th
39c0: 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  is key */.  int 
39d0: 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  distinct,       
39e0: 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d      /* If >=0, m
39f0: 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73  ake sure results
3a00: 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f   are distinct */
3a10: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
3a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
3a30: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
3a40: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
3a50: 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20   int iParm,     
3a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61           /* An a
3a70: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 64  rgument to the d
3a80: 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a  isposal method *
3a90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
3aa0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  e,          /* J
3ab0: 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
3ac0: 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72  inue with next r
3ad0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ow */.  int iBre
3ae0: 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ak,             
3af0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
3b00: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
3b10: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20   inner loop */. 
3b20: 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20   char *aff      
3b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66 69           /* affi
3b40: 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20 65  nity string if e
3b50: 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
3b60: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
3b70: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3b80: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
3b90: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
3ba0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3bb0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
3bc0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
3bd0: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
3be0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
3bf0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
3c00: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
3c10: 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  e was a LIMIT cl
3c20: 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c 45  ause on the SELE
3c30: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
3c40: 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b 0a  en do the check.
3c50: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74    ** to see if t
3c60: 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20 62  his row should b
3c70: 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
3c80: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
3c90: 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70 45  istinct>=0 && pE
3ca0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
3cb0: 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20 70  nExpr>0;.  if( p
3cc0: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68  OrderBy==0 && !h
3cd0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
3ce0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
3cf0: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30 29  p, iContinue, 0)
3d00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
3d10: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
3d20: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
3d30: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
3d40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3d50: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
3d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3d70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
3d80: 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20  n, srcTab, i);. 
3d90: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3da0: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69    nColumn = pELi
3db0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73  st->nExpr;.    s
3dc0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
3dd0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
3de0: 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
3df0: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
3e00: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
3e10: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
3e20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
3e30: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
3e40: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
3e50: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
3e60: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
3e70: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
3e80: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
3e90: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
3ea0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
3eb0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3ec0: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76    codeDistinct(v
3ed0: 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e  , distinct, iCon
3ee0: 74 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31 29 3b 0a  tinue, n, n+1);.
3ef0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
3f00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
3f10: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
3f20: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
3f30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
3f40: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
3f50: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
3f60: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
3f70: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
3f80: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
3f90: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
3fa0: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
3fb0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
3fc0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
3fd0: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
3fe0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
3ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4000: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
4010: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
4020: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
4030: 54 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 69 66  TINCT);.      if
4040: 28 20 61 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ( aff ){.       
4050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4060: 67 65 50 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c  geP3(v, -1, aff,
4070: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
4080: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4090: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
40a0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
40b0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
40c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
40d0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
40e0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
40f0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
4100: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
4110: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
4120: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
4130: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
4140: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
4150: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
4160: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
4170: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4180: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
4190: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
41a0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
41b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
41c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
41d0: 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57  Column, NULL_ALW
41e0: 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20  AYS_DISTINCT);. 
41f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4200: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
4210: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
4220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4230: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
4240: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
4250: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
4260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4270: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61  , OP_Delete, iPa
4280: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
4290: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
42a0: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
42b0: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
42c0: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
42d0: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
42e0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
42f0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 56  :.    case SRT_V
4300: 69 72 74 75 61 6c 54 61 62 3a 20 7b 0a 20 20 20  irtualTab: {.   
4310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4320: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
4330: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
4340: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
4350: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4360: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
4370: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
4380: 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , p);.      }els
4390: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
43a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
43b0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
43c0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
43d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
43e0: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
43f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4400: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4410: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
4420: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4430: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4440: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4450: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
4460: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
4470: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
4480: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
4490: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
44a0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
44b0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
44c0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
44d0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
44e0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
44f0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
4500: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
4510: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
4520: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
4530: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
4540: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
4550: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4560: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  );.      int add
4570: 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  r2;..      asser
4580: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
4590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
45a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
45b0: 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 31  tNull, -1, addr1
45c0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
45d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
45e0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
45f0: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
4600: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4610: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
4620: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4630: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  By ){.        /*
4640: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
4650: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
4660: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
4670: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
4680: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
4690: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
46a0: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
46b0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
46c0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
46d0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
46e0: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
46f0: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
4700: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
4710: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
4720: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
4730: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
4740: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4750: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29 3b  e, pOrderBy, p);
4760: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4770: 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20 3d        char aff =
4780: 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78 46   (iParm>>16)&0xF
4790: 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  F;.        aff =
47a0: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
47b0: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
47c0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
47d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
47e0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
47f0: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
4800: 20 26 61 66 66 2c 20 31 29 3b 0a 20 20 20 20 20   &aff, 1);.     
4810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4820: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
4830: 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30  ert, (iParm&0x00
4840: 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20  00FFFF), 0);.   
4850: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
4860: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4870: 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 20 20  , addr2);.      
4880: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4890: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
48a0: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 72 65  exists in the re
48b0: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
48c0: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
48d0: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
48e0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
48f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4900: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4910: 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 50 61 72  _MemInt, 1, iPar
4920: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
4930: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4940: 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  _Pop, nColumn, 0
4950: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
4960: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
4970: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
4980: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
4990: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
49a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
49b0: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
49c0: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
49d0: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
49e0: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
49f0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
4a00: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
4a10: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
4a20: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
4a30: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
4a40: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
4a50: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
4a60: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
4a70: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
4a80: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
4a90: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
4aa0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
4ab0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 29  se, pOrderBy, p)
4ac0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4ad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4ae0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
4af0: 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31  mStore, iParm, 1
4b00: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  );.        /* Th
4b10: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
4b20: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
4b30: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
4b40: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
4b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4b60: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
4b70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4b80: 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
4b90: 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  Send the data to
4ba0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75   the callback fu
4bb0: 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73  nction or to a s
4bc0: 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74  ubroutine.  In t
4bd0: 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f  he.    ** case o
4be0: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20  f a subroutine, 
4bf0: 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
4c00: 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73  tself is respons
4c10: 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ible for.    ** 
4c20: 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  popping the data
4c30: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
4c40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4c50: 20 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a   SRT_Subroutine:
4c60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 61  .    case SRT_Ca
4c70: 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20  llback: {.      
4c80: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
4c90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4ca0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4cb0: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
4cc0: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mn, 0);.        
4cd0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4ce0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4cf0: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4d00: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
4d10: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
4d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73  eAddOp(v, OP_Gos
4d40: 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20  ub, 0, iParm);. 
4d50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4d70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
4d80: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
4d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4da0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
4db0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4dc0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
4dd0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
4de0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
4df0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
4e00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
4e10: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
4e20: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
4e30: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
4e40: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
4e50: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
4e60: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
4e70: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4e80: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
4e90: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
4ea0: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
4eb0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
4ec0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
4ed0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
4ee0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
4ef0: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
4f00: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
4f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f20: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43  Op(v, OP_Pop, nC
4f30: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4f40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4f50: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
4f60: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
4f70: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
4f80: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
4f90: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
4fa0: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26 20 70  ->iLimit>=0 && p
4fb0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
4fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4fd0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
4fe0: 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  , -1, p->iLimit)
4ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5000: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
5010: 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  emZero, p->iLimi
5020: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
5030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5040: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
5050: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
5060: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
5070: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
5080: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
5090: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
50a0: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
50b0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
50c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
50d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
50e0: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
50f0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
5100: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
5110: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
5120: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5130: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
5140: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
5150: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
5160: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
5170: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
5180: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
5190: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
51a0: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
51b0: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
51c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
51d0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
51e0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
51f0: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
5200: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
5210: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
5220: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
5230: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5240: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66  ture is obtain f
5250: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
5260: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
5270: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
5280: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
5290: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
52a0: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
52b0: 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20  .** freed.  Add 
52c0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
52d0: 63 74 75 72 65 20 74 6f 20 74 68 65 20 50 33 20  cture to the P3 
52e0: 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f  field of an opco
52f0: 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b  de using.** P3_K
5300: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
5310: 73 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20  s the usual way 
5320: 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  of dealing with 
5330: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
5340: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
5350: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72  FromExprList(Par
5360: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5370: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
5380: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5390: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
53a0: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
53b0: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
53c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
53d0: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
53e0: 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  ..  nExpr = pLis
53f0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  t->nExpr;.  pInf
5400: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
5410: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  ( sizeof(*pInfo)
5420: 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
5430: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
5440: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
5450: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
5460: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
5470: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  nfo->aColl[nExpr
5480: 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46  ];.    pInfo->nF
5490: 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20  ield = nExpr;.  
54a0: 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64    pInfo->enc = d
54b0: 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 66 6f 72 28  b->enc;.    for(
54c0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
54d0: 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  ->a; i<nExpr; i+
54e0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
54f0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
5500: 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  l;.      pColl =
5510: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
5520: 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
5530: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
5540: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
5550: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64         pColl = d
5560: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
5570: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66      }.      pInf
5580: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  o->aColl[i] = pC
5590: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
55a0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
55b0: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
55c0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
55d0: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
55e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
55f0: 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65  nner loop was ge
5600: 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20  nerated using a 
5610: 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42  non-null pOrderB
5620: 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74  y argument,.** t
5630: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
5640: 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61  were placed in a
5650: 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20   sorter.  After 
5660: 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d  the loop is term
5670: 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65  inated.** we nee
5680: 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72  d to run the sor
5690: 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74  ter and output t
56a0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65  he results.  The
56b0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f   following.** ro
56c0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
56d0: 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20  the code needed 
56e0: 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73  to do that..*/.s
56f0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
5700: 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50  ateSortTail(.  P
5710: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5720: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
5730: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5740: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20  ct *p,       /* 
5750: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
5760: 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ment */.  Vdbe *
5770: 76 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  v,         /* Ge
5780: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5790: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
57a0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
57b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
57c0: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
57d0: 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20  .  int eDest,   
57e0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
57f0: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
5800: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  here */.  int iP
5810: 61 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  arm        /* Op
5820: 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72  tional parameter
5830: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5840: 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69   eDest */.){.  i
5850: 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33  nt brk = sqlite3
5860: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5870: 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73  ;.  int cont = s
5880: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5890: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64  bel(v);.  int ad
58a0: 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a  dr;.  int iTab;.
58b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
58c0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
58d0: 42 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f  By;..  iTab = pO
58e0: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
58f0: 3b 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73  ;.  addr = 1 + s
5900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5910: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
5920: 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66  , brk);.  codeOf
5930: 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e 74 2c  fset(v, p, cont,
5940: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
5950: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
5960: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64  lumn, iTab, pOrd
5970: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 29  erBy->nExpr + 1)
5980: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
5990: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
59a0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
59b0: 65 20 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  e SRT_VirtualTab
59c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
59d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
59e0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
59f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5a00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5a10: 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a  OP_Pull, 1, 0);.
5a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73  eAddOp(v, OP_Ins
5a40: 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ert, iParm, 0);.
5a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a60: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
5a70: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
5a80: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
5a90: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5aa0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ac0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
5ad0: 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71 6c 69 74 65  Null, -1, sqlite
5ae0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5af0: 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  (v)+3);.      sq
5b00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5b10: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
5b20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5b30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
5b40: 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  to, 0, sqlite3Vd
5b50: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
5b60: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
5b70: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
5b80: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
5b90: 2c 20 22 63 22 2c 20 50 33 5f 53 54 41 54 49 43  , "c", P3_STATIC
5ba0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5bb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5bc0: 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61 72  IdxInsert, (iPar
5bd0: 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20 30  m&0x0000FFFF), 0
5be0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bf0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
5c00: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
5c10: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5c20: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
5c30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5c40: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61  OP_MemStore, iPa
5c50: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
5c60: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5c70: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
5c80: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
5c90: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
5ca0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5cb0: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
5cc0: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
5cd0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a  T_Subroutine: {.
5ce0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
5cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d00: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
5d10: 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  r, p->pEList->nE
5d20: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
5d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5d40: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30  v, OP_Pull, 1, 0
5d50: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
5d60: 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ; i<nColumn; i++
5d70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5d80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5d90: 50 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20  P_Column, -1-i, 
5da0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
5db0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
5dc0: 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _Callback ){.   
5dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5de0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c  AddOp(v, OP_Call
5df0: 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  back, nColumn, 0
5e00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5e20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5e30: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
5e40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
5e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5e60: 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29  v, OP_Pop, 2, 0)
5e70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5e80: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5e90: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
5ea0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
5eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5ec0: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
5ed0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
5ee0: 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d  oop when the LIM
5ef0: 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20 20  IT is reached.  
5f00: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
5f10: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
5f20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5f30: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c   OP_MemIncr, -1,
5f40: 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20   p->iLimit);.   
5f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f60: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
5f70: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72  o, p->iLimit, br
5f80: 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  k);.  }..  /* Th
5f90: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
5fa0: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
5fb0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5fc0: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
5fd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5fe0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
5ff0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
6000: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6010: 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 7d 0a 0a  bel(v, brk);.}..
6020: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
6030: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
6040: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
6050: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
6060: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
6070: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
6080: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
6090: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
60a0: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
60b0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
60c0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
60d0: 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64  e is the exact d
60e0: 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69  atatype definiti
60f0: 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  on extracted fro
6100: 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61  m.** the origina
6110: 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  l CREATE TABLE s
6120: 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20  tatement if the 
6130: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6140: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  column..** .** T
6150: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
6160: 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70 72 65  ype for an expre
6170: 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ssion is either 
6180: 54 45 58 54 2c 20 4e 55 4d 45 52 49 43 20 6f 72  TEXT, NUMERIC or
6190: 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20 64 65 63   ANY..** The dec
61a0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
61b0: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
61c0: 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73  is INTEGER..*/.s
61d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
61e0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 4e 61 6d   *columnType(Nam
61f0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45  eContext *pNC, E
6200: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
6210: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
6220: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28  ;.  int j;.  if(
6230: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43   pExpr==0 || pNC
6240: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
6250: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
6260: 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72 61 74  The TK_AS operat
6270: 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  or can only occu
6280: 72 20 69 6e 20 4f 52 44 45 52 20 42 59 2c 20 47  r in ORDER BY, G
6290: 52 4f 55 50 20 42 59 2c 20 48 41 56 49 4e 47 2c  ROUP BY, HAVING,
62a0: 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20  .  ** and LIMIT 
62b0: 63 6c 61 75 73 65 73 2e 20 20 42 75 74 20 70 45  clauses.  But pE
62c0: 78 70 72 20 6f 72 69 67 69 6e 61 74 65 73 20 69  xpr originates i
62d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
62e0: 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43   of a.  ** SELEC
62f0: 54 2e 20 20 53 6f 20 70 45 78 70 72 20 63 61 6e  T.  So pExpr can
6300: 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 61   never contain a
6310: 6e 20 41 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n AS operator.. 
6320: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
6330: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29  xpr->op!=TK_AS )
6340: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
6350: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
6360: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
6370: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
6380: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  b = 0;.      int
6390: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
63a0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 77 68  Column;.      wh
63b0: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
63c0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
63d0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
63e0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
63f0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
6400: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
6410: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
6420: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
6430: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
6440: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
6450: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
6460: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
6470: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6480: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 65  pTab;.        }e
6490: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
64a0: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
64b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
64c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54 61   }.      if( pTa
64d0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
64e0: 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20  /* FIX ME:.     
64f0: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f     ** This can o
6500: 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61 76  ccurs if you hav
6510: 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  e something like
6520: 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22   "SELECT new.x;"
6530: 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20   inside.        
6540: 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20 49  ** a trigger.  I
6550: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
6560: 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20  f you reference 
6570: 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77  the special "new
6580: 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62  ".        ** tab
6590: 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  le in the result
65a0: 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74   set of a select
65b0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76  .  We do not hav
65c0: 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20  e a good way.   
65d0: 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20       ** to find 
65e0: 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65  the actual table
65f0: 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69   type, so call i
6600: 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73 20  t "TEXT".  This 
6610: 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20  is really.      
6620: 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f    ** something o
6630: 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20 64  f a bug, but I d
6640: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74  o not know how t
6650: 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20  o fix it..      
6660: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
6670: 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e  This code does n
6680: 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20 63  ot produce the c
6690: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20  orrect answer - 
66a0: 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73  it just prevents
66b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65  .        ** a se
66c0: 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63  gfault.  See tic
66d0: 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20  ket #1229..     
66e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54     */.        zT
66f0: 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20  ype = "TEXT";.  
6700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6710: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
6720: 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20  t( pTab );.     
6730: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
6740: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
6750: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6760: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
6770: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
6780: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
6790: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
67a0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
67b0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
67c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
67d0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
67e0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
67f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6800: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
6810: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
6820: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6830: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
6840: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
6850: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
6860: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70  t *pS = pExpr->p
6870: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 4e  Select;.      sN
6880: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 45 78  C.pSrcList = pEx
6890: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  pr->pSelect->pSr
68a0: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
68b0: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
68c0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
68d0: 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e 70 45 4c  pe(&sNC, pS->pEL
68e0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
68f0: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
6900: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6910: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
6920: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zType = 0;.  }. 
6930: 20 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65   .  return zType
6940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
6950: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
6960: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
6970: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
6980: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
6990: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
69a0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
69b0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
69c0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
69d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
69e0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
69f0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
6a00: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
6a10: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
6a20: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
6a30: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
6a40: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
6a50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
6a60: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
6a70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6a80: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
6a90: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
6aa0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
6ab0: 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  bList;.  for(i=0
6ac0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
6ad0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
6ae0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
6af0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
6b00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6b10: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
6b20: 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  NC, p);.    if( 
6b30: 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69  zType==0 ) conti
6b40: 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  nue;.    /* The 
6b50: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
6b60: 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  t's own copy of 
6b70: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 2c  the column-type,
6b80: 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a 20 20   in case the .  
6b90: 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73 20 72    ** schema is r
6ba0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
6bb0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
6bc0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
6bd0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
6be0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
6bf0: 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i+pEList->nExpr
6c00: 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65 6e 28  , zType, strlen(
6c10: 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  zType));.  }.}..
6c20: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
6c30: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
6c40: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
6c50: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
6c60: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
6c70: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
6c80: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
6c90: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
6ca0: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
6cb0: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
6cc0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
6cd0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
6ce0: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
6cf0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6d00: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
6d10: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
6d20: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
6d30: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
6d40: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
6d50: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6d60: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
6d70: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
6d80: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6d90: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
6da0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
6db0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6dc0: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
6dd0: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
6de0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6df0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
6e00: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
6e10: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
6e20: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
6e30: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
6e40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
6e50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
6e60: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
6e70: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
6e80: 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20  amesSet || v==0 
6e90: 7c 7c 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  || sqlite3Tsd()-
6ea0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
6eb0: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
6ec0: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
6ed0: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
6ee0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
6ef0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
6f00: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
6f10: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
6f20: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
6f30: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
6f40: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6f50: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
6f60: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
6f70: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
6f80: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
6f90: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
6fa0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6fb0: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
6fc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6fd0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6fe0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
6ff0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
7000: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7020: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
7030: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
7040: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
7050: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
7060: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
7070: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
7080: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
7090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
70a0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
70b0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
70c0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
70d0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
70e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
70f0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
7100: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
7110: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
7120: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
7130: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
7140: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
7150: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
7160: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
7170: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
7180: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
7190: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
71a0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
71b0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
71c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
71d0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
71e0: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
71f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
7200: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
7210: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
7220: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
7230: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
7240: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
7250: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
7260: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
7270: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
7280: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 28 63 68  olName(v, i, (ch
7290: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
72a0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
72b0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
72c0: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
72d0: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
72e0: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
72f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
7300: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
7310: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
7320: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
7330: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
7340: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
7350: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
7360: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
7370: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
7380: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
7390: 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c 20  g(&zName, zTab, 
73a0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28 63 68 61 72  ".", zCol, (char
73b0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  *)0);.        sq
73c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
73d0: 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c  ame(v, i, zName,
73e0: 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P3_DYNAMIC);.  
73f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
7410: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a  tColName(v, i, z
7420: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
7430: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
7440: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
7450: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
7460: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
7470: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7480: 6d 65 28 76 2c 20 69 2c 20 28 63 68 61 72 2a 29  me(v, i, (char*)
7490: 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70  p->span.z, p->sp
74a0: 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20  an.n);.      /* 
74b0: 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72  sqlite3VdbeCompr
74c0: 65 73 73 53 70 61 63 65 28 76 2c 20 61 64 64 72  essSpace(v, addr
74d0: 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  ); */.    }else{
74e0: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d  .      char zNam
74f0: 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73  e[30];.      ass
7500: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43  ert( p->op!=TK_C
7510: 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73  OLUMN || pTabLis
7520: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70  t==0 );.      sp
7530: 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f  rintf(zName, "co
7540: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
7550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7560: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7570: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
7580: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
7590: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
75a0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
75b0: 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  List);.}..#ifnde
75c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
75d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
75e0: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
75f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
7600: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
7610: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
7620: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7630: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
7640: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
7650: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
7660: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
7670: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
7680: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
7690: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
76a0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
76b0: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
76c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
76d0: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
76e0: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
76f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
7700: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
7710: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
7720: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
7730: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
7740: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7750: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7760: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
7770: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
7780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
7790: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
77a0: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f  e*, Select*);../
77b0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
77c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
77d0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
77e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
77f0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
7800: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7810: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
7820: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
7830: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
7840: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
7850: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
7860: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
7870: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
7880: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
7890: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
78a0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
78b0: 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70 72 65 70  Col;..  if( prep
78c0: 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73  SelectStmt(pPars
78d0: 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20  e, pSelect) ){. 
78e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
78f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
7900: 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
7910: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20  se, pSelect, 0) 
7920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7930: 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71  .  }.  pTab = sq
7940: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
7950: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
7960: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
7970: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7980: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
7990: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
79a0: 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c  = zTabName ? sql
79b0: 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61  iteStrDup(zTabNa
79c0: 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73  me) : 0;.  pELis
79d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
79e0: 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f  ist;.  pTab->nCo
79f0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
7a00: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
7a10: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  b->nCol>0 );.  p
7a20: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c  Tab->aCol = aCol
7a30: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
7a40: 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43   sizeof(pTab->aC
7a50: 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f  ol[0])*pTab->nCo
7a60: 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  l );.  for(i=0, 
7a70: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61  pCol=aCol; i<pTa
7a80: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
7a90: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ol++){.    Expr 
7aa0: 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61  *p, *pR;.    cha
7ab0: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68  r *zType;.    ch
7ac0: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  ar *zName;.    c
7ad0: 68 61 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a  har *zBasename;.
7ae0: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
7af0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7b00: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65  ;.    .    /* Ge
7b10: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
7b20: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
7b30: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
7b40: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
7b50: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
7b60: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
7b70: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
7b80: 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e  oken.z==0 || p->
7b90: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
7ba0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
7bb0: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
7bc0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
7bd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
7be0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
7bf0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
7c00: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
7c10: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
7c20: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
7c30: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
7c40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
7c50: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
7c60: 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  DOT .           
7c70: 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69     && (pR=p->pRi
7c80: 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74  ght)!=0 && pR->t
7c90: 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f  oken.z && pR->to
7ca0: 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  ken.z[0] ){.    
7cb0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
7cc0: 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42   of the from A.B
7cd0: 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61   use B as the na
7ce0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
7cf0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
7d00: 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f  tf("%T", &pR->to
7d10: 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ken);.    }else 
7d20: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
7d30: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
7d40: 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  .      /* Use th
7d50: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
7d60: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
7d70: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
7d80: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
7d90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
7da0: 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73  intf("%T", &p->s
7db0: 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pan);.    }else{
7dc0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c  .      /* If all
7dd0: 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b   else fails, mak
7de0: 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20  e up a name */. 
7df0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
7e00: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c  ite3MPrintf("col
7e10: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
7e20: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
7e30: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
7e40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 73     if( sqlite3Ts
7e50: 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  d()->mallocFaile
7e60: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
7e70: 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  eFree(zName);.  
7e80: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
7e90: 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b  eTable(0, pTab);
7ea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
7eb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
7ec0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
7ed0: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
7ee0: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
7ef0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
7f00: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20      ** append a 
7f10: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
7f20: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
7f30: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
7f40: 20 20 20 2a 2f 0a 20 20 20 20 7a 42 61 73 65 6e     */.    zBasen
7f50: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
7f60: 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c   for(j=cnt=0; j<
7f70: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  i; j++){.      i
7f80: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
7f90: 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  p(aCol[j].zName,
7fa0: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20   zName)==0 ){.  
7fb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
7fc0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73  lite3MPrintf("%s
7fd0: 3a 25 64 22 2c 20 7a 42 61 73 65 6e 61 6d 65 2c  :%d", zBasename,
7fe0: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
7ff0: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
8000: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
8010: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
8020: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 42 61     }.    if( zBa
8030: 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b  sename!=zName ){
8040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
8050: 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b 0a 20 20  e(zBasename);.  
8060: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
8070: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20  ame = zName;..  
8080: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70    /* Get the typ
8090: 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69  ename, type affi
80a0: 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74  nity, and collat
80b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
80c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75   the.    ** colu
80d0: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  mn..    */.    m
80e0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
80f0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
8100: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8110: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
8120: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
8130: 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79  eStrDup(columnTy
8140: 70 65 28 26 73 4e 43 2c 20 70 29 29 3b 0a 20 20  pe(&sNC, p));.  
8150: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
8160: 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d  zType;.    pCol-
8170: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8180: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
8190: 70 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 70 43  p);.    pCol->pC
81a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
81b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
81c0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43   p);.    if( !pC
81d0: 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ol->pColl ){.   
81e0: 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d     pCol->pColl =
81f0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
8200: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  ltColl;.    }.  
8210: 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  }.  pTab->iPKey 
8220: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
8230: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
8240: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
8250: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
8260: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
8270: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
8280: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
8290: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
82a0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
82b0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
82c0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
82d0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
82e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
82f0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
8300: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
8310: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
8320: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
8330: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
8340: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
8350: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
8360: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
8370: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
8380: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
8390: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
83a0: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
83b0: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
83c0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
83d0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
83e0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
83f0: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
8400: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
8410: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
8420: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
8430: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
8440: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
8450: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
8460: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
8470: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
8480: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
8490: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
84a0: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
84b0: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
84c0: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
84d0: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
84e0: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
84f0: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
8500: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
8510: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
8520: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
8530: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
8540: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
8550: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
8560: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
8570: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
8580: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
8590: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
85a0: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
85b0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
85c0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
85d0: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
85e0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
85f0: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
8600: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
8610: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
8620: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
8630: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
8640: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
8650: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
8660: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
8670: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
8680: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
8690: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
86a0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
86b0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
86c0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
86d0: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
86e0: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
86f0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
8700: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
8710: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
8720: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
8730: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
8740: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
8750: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
8760: 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66  em *pFrom;..  if
8770: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72  ( p==0 || p->pSr
8780: 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 54  c==0 || sqlite3T
8790: 73 64 28 29 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  sd()->mallocFail
87a0: 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
87b0: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
87c0: 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
87d0: 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
87e0: 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
87f0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
8800: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
8810: 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
8820: 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
8830: 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
8840: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
8850: 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
8860: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
8870: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29  pParse, p->pSrc)
8880: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
8890: 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
88a0: 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
88b0: 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
88c0: 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
88d0: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
88e0: 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
88f0: 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
8900: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
8910: 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
8920: 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
8930: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
8940: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
8950: 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
8960: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
8970: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
8980: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
8990: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
89a0: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
89b0: 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
89c0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
89d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
89e0: 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
89f0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
8a00: 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
8a10: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
8a20: 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
8a30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8a40: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f    }.    if( pFro
8a50: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
8a60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8a70: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
8a80: 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
8a90: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
8aa0: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
8ab0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
8ac0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
8ad0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
8ae0: 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30  pFrom->zAlias==0
8af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   ){.        pFro
8b00: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20  m->zAlias =.    
8b10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
8b20: 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62  intf("sqlite_sub
8b30: 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69  query_%p_", (voi
8b40: 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  d*)pFrom->pSelec
8b50: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
8b60: 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
8b70: 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
8b80: 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
8b90: 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20  pTab = .        
8ba0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
8bb0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
8bc0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20   pFrom->zAlias, 
8bd0: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
8be0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
8bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
8c00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
8c10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54        /* The isT
8c20: 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e  ransient flag in
8c30: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
8c40: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
8c50: 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
8c60: 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  ** dynamically a
8c70: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79  llocated and may
8c80: 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e 79   be freed at any
8c90: 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72   time.  In other
8ca0: 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a   words,.      **
8cb0: 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69   pTab is not poi
8cc0: 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69  nting to a persi
8cd0: 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  stent table stru
8ce0: 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e  cture that defin
8cf0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74  es.      ** part
8d00: 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20   of the schema. 
8d10: 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  */.      pTab->i
8d20: 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a  sTransient = 1;.
8d30: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
8d40: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
8d50: 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
8d60: 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
8d70: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
8d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
8d90: 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
8da0: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
8db0: 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20  b = pTab = .    
8dc0: 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
8dd0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46  eTable(pParse,pF
8de0: 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d  rom->zName,pFrom
8df0: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
8e00: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
8e10: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8e20: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
8e30: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
8e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8e50: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 20 20  OMIT_VIEW.      
8e60: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
8e70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
8e80: 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
8e90: 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
8ea0: 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
8eb0: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
8ec0: 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
8ed0: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
8ee0: 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
8ef0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
8f00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8f10: 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d      /* If pFrom-
8f20: 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d  >pSelect!=0 it m
8f30: 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
8f40: 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20  ing with a.     
8f50: 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69     ** view withi
8f60: 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53  n a view.  The S
8f70: 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20  ELECT structure 
8f80: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
8f90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69  .        ** copi
8fa0: 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20  ed by the outer 
8fb0: 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73  view so we can s
8fc0: 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65  kip the copy ste
8fd0: 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a  p here.        *
8fe0: 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76  * in the inner v
8ff0: 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  iew..        */.
9000: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f          if( pFro
9010: 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  m->pSelect==0 ){
9020: 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
9030: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
9040: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61  te3SelectDup(pTa
9050: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
9060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
9070: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
9080: 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
9090: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
90a0: 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
90b0: 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
90c0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
90d0: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
90e0: 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74  pParse, p) ) ret
90f0: 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72  urn 1;..  /* For
9100: 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
9110: 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
9120: 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
9130: 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
9140: 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
9150: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
9160: 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
9170: 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
9180: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
9190: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
91a0: 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
91b0: 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
91c0: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
91d0: 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
91e0: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
91f0: 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
9200: 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
9210: 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
9220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
9230: 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
9240: 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
9250: 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
9260: 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
9270: 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
9280: 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
9290: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
92a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
92b0: 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
92c0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
92d0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
92e0: 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
92f0: 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
9300: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
9310: 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
9320: 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
9330: 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69   Expr *pE = pELi
9340: 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
9350: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
9360: 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
9370: 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
9380: 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
9390: 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67  ight && pE->pRig
93a0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20  ht->op==TK_ALL. 
93b0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70          && pE->p
93c0: 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66  Left && pE->pLef
93d0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62  t->op==TK_ID ) b
93e0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  reak;.  }.  rc =
93f0: 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69   0;.  if( k<pELi
9400: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
9410: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
9420: 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
9430: 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
9440: 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
9450: 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
9460: 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
9470: 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
9480: 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
9490: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
94a0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
94b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
94c0: 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
94d0: 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
94e0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
94f0: 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
9500: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
9510: 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
9520: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
9530: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
9540: 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
9550: 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
9560: 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
9570: 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20  ames)!=0 &&.    
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54    (flags & SQLIT
95a0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
95b0: 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
95c0: 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
95d0: 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
95e0: 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
95f0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
9600: 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
9610: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
9620: 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
9630: 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
9640: 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
9650: 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
9660: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
9670: 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
9680: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
9690: 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
96a0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
96b0: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
96c0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
96d0: 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70  (pNew, a[k].pExp
96e0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
96f0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
9700: 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
9710: 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
9720: 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
9730: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9740: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
9750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9760: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
9770: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
9780: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
9790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
97a0: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
97b0: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
97c0: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
97d0: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
97e0: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
97f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
9800: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
9810: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
9820: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
9830: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
9840: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
9850: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
9860: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
9870: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
9880: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
9890: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
98a0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
98b0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
98c0: 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d  oken(&pE->pLeft-
98d0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
98e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
98f0: 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
9900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9910: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
9920: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
9930: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
9940: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
9950: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
9960: 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
9970: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
9980: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
9990: 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
99a0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
99b0: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
99c0: 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20  e[0]==0 ){ .    
99d0: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
99e0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
99f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9a00: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
9a10: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
9a20: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
9a30: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
9a40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
9a50: 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
9a60: 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a  TabName)!=0) ){.
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
9a80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
9a90: 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
9aa0: 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
9ab0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
9ac0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
9ad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
9ae0: 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66  pr *pExpr, *pLef
9af0: 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  t, *pRight;.    
9b00: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
9b10: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
9b20: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  [j].zName;..    
9b30: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
9b40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9b50: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
9b60: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
9b70: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
9b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
9b90: 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  f( (pLeft->joint
9ba0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
9bb0: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
9be0: 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
9bf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9c00: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
9c10: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
9c20: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
9c30: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
9c50: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
9c60: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
9c70: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
9ca0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
9cb0: 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e  dex(pLeft->pUsin
9cc0: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
9cf0: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
9d00: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
9d10: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
9d20: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
9d30: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
9d40: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
9d50: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
9d60: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
9d90: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
9da0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
9db0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9dd0: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
9de0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
9df0: 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d  etToken(&pRight-
9e00: 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a  >token, zName);.
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9e20: 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e  zTabName && (lon
9e30: 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
9e40: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
9e60: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
9e70: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
9e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9e90: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
9ea0: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
9eb0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
9ed0: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
9ee0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
9ef0: 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74   setToken(&pLeft
9f00: 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d  ->token, zTabNam
9f10: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
9f20: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70    setToken(&pExp
9f30: 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33  r->span, sqlite3
9f40: 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c  MPrintf("%s.%s",
9f50: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
9f60: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
9f70: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
9f80: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
9f90: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
9fa0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
9fb0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
9fc0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
9fd0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
9fe0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
a000: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
a010: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
a030: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
a040: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
a050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a060: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
a070: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
a080: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
a090: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a0a0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
a0b0: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
a0c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
a0e0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
a0f0: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
a100: 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
a110: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
a120: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a130: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
a140: 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
a150: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
a160: 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
a170: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a180: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a190: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
a1a0: 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
a1b0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
a1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a1d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a1e0: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
a1f0: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
a200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a210: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
a220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
a230: 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b  iteFree(zTName);
a240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a250: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
a260: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
a270: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
a280: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
a290: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
a2a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a2b0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
a2c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a2d0: 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e  ne associates en
a2e0: 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45  tries in an ORDE
a2f0: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
a300: 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c  list with.** col
a310: 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74  umns in a result
a320: 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45  .  For each ORDE
a330: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  R BY expression,
a340: 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a   the opcode of.*
a350: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
a360: 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  node is changed 
a370: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
a380: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c   the iColumn val
a390: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  ue of.** the top
a3a0: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
a3b0: 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f  illed in with co
a3c0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20  lumn number and 
a3d0: 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61  the iTable.** va
a3e0: 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  lue of the top-l
a3f0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
a400: 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20  led with iTable 
a410: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
a420: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
a430: 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73  ior SELECT claus
a440: 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f  es, they are pro
a450: 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41  cessed first.  A
a460: 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20   match.** in an 
a470: 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74  earlier SELECT t
a480: 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20  akes precedence 
a490: 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c  over a later SEL
a4a0: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ECT..**.** Any e
a4b0: 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e  ntry that does n
a4c0: 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67  ot match is flag
a4d0: 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ged as an error.
a4e0: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
a4f0: 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  of errors is ret
a500: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
a510: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
a520: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
a530: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a540: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
a550: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
a560: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
a570: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
a580: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
a590: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
a5a0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
a5b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
a5c0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
a5d0: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
a5e0: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
a5f0: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
a600: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
a610: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
a620: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
a630: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
a640: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
a650: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
a660: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
a670: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
a680: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
a690: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
a6a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
a6b0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
a6c0: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
a6d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
a6e0: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
a6f0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
a700: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
a710: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
a720: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
a730: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65   }.  }.  if( pre
a740: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
a750: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
a760: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
a770: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
a780: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
a790: 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  f( matchOrderbyT
a7a0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
a7b0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
a7c0: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
a7d0: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
a7e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
a7f0: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
a800: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
a810: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
a820: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
a830: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
a840: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
a850: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  .pExpr;.    int 
a860: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iCol = -1;.    i
a870: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
a880: 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ].done ) continu
a890: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
a8a0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
a8b0: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
a8c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
a8d0: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
a8e0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
a8f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a900: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
a910: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
a920: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
a930: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
a940: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
a950: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
a960: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
a970: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
a980: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
a990: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
a9a0: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
a9b0: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
a9c0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
a9d0: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
a9e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
a9f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
aa00: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
aa10: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
aa20: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
aa30: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
aa40: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
aa50: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
aa60: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
aa70: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
aa80: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
aa90: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
aaa0: 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  en(&pE->token);.
aab0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
aac0: 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20  zLabel!=0 );.   
aad0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
aae0: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
aaf0: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
ab00: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
ab10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ab20: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
ab30: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
ab40: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ab50: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
ab60: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
ab70: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
ab80: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
ab90: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
aba0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
abb0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
abc0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
abd0: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
abe0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
abf0: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
ac00: 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41  le;.      pE->iA
ac10: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  gg = -1;.      p
ac20: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
ac30: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
ac40: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
ac50: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
ac60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
ac70: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
ac80: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
ac90: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
aca0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
acb0: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
acc0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
acd0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
ace0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
acf0: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
ad00: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
ad10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ad20: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
ad30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
ad40: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
ad50: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
ad60: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
ad70: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
ad80: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ad90: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
ada0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
adb0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
adc0: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
add0: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
ade0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
adf0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
ae00: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
ae10: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
ae20: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
ae30: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
ae40: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
ae50: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
ae60: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
ae70: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
ae80: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
ae90: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
aea0: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
aeb0: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
aec0: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
aed0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
aee0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
aef0: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
af00: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
af10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
af20: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
af30: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
af40: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
af50: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
af60: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
af70: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
af80: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
af90: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
afa0: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
afb0: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
afc0: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
afd0: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
afe0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
aff0: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
b000: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
b010: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
b020: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
b030: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
b040: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
b050: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
b060: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
b070: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
b080: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
b090: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
b0a0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
b0b0: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
b0c0: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
b0d0: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
b0e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
b0f0: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28  ault values.** (
b100: 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20  usually but not 
b110: 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72  always -1) prior
b120: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
b130: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c   routine..** Onl
b140: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
b150: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
b160: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
b170: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
b180: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
b190: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
b1a0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
b1b0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
b1c0: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
b1d0: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
b1e0: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
b1f0: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
b200: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b210: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
b220: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
b230: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
b240: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
b250: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
b260: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
b270: 20 69 4c 69 6d 69 74 3b 0a 20 20 69 6e 74 20 69   iLimit;.  int i
b280: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
b290: 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f  dr1, addr2;..  /
b2a0: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
b2b0: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
b2c0: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
b2d0: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
b2e0: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
b2f0: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
b300: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
b310: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
b320: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
b330: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
b340: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
b350: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
b360: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
b370: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
b380: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
b390: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
b3a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
b3b0: 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71  += 2;.    v = sq
b3c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b3d0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
b3e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
b3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b400: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
b410: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
b420: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b430: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
b440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b450: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
b460: 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 30  Store, iLimit, 0
b470: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
b480: 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20  nt((v, "# LIMIT 
b490: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
b4a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4b0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
b4c0: 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
b4d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
b4e0: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70  pOffset ){.    p
b4f0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  ->iOffset = iOff
b500: 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  set = pParse->nM
b510: 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71  em++;.    v = sq
b520: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b530: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
b540: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
b550: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b560: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
b570: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
b580: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b590: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30  _MustBeInt, 0, 0
b5a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b5b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
b5c0: 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c  mStore, iOffset,
b5d0: 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a   p->pLimit==0);.
b5e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b5f0: 28 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f  (v, "# OFFSET co
b600: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64  unter"));.    ad
b610: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
b620: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
b630: 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20  emPos, iOffset, 
b640: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
b650: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
b660: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  op, 1, 0);.    s
b670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b680: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
b690: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b6a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b6b0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
b6c0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20  ddOp(v, OP_Add, 
b6f0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
b700: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
b710: 20 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20   ){.    addr1 = 
b720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b730: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
b740: 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20   iLimit, 0);.   
b750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b760: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
b770: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
b780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
b790: 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69  emInt, -1, iLimi
b7a0: 74 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20  t+1);.    addr2 
b7b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b7c0: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
b7d0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
b7e0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b7f0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
b800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b810: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c   OP_MemStore, iL
b820: 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20  imit+1, 1);.    
b830: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b840: 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  "# LIMIT+OFFSET"
b850: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
b860: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b870: 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ddr2);.  }.}../*
b880: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76  .** Allocate a v
b890: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
b8a0: 75 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  use for sorting.
b8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b8c0: 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64  createSortingInd
b8d0: 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
b8e0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70  , Select *p, Exp
b8f0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29  rList *pOrderBy)
b900: 7b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  {.  if( pOrderBy
b910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
b920: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
b930: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
b940: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65  ==0 );.    pOrde
b950: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
b960: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
b970: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
b980: 65 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72  e3VdbeAddOp(pPar
b990: 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70  se->pVdbe, OP_Op
b9a0: 65 6e 56 69 72 74 75 61 6c 2c 0a 20 20 20 20 20  enVirtual,.     
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
b9d0: 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
b9e0: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20  rBy->nExpr+1);. 
b9f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ba00: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 3d  drOpenVirt[2] ==
ba10: 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64   -1 );.    p->ad
ba20: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20  drOpenVirt[2] = 
ba30: 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  addr;.  }.}../*.
ba40: 2a 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 61 74  ** The opcode at
ba50: 20 61 64 64 72 20 69 73 20 61 6e 20 4f 50 5f 4f   addr is an OP_O
ba60: 70 65 6e 56 69 72 74 75 61 6c 20 74 68 61 74 20  penVirtual that 
ba70: 63 72 65 61 74 65 64 20 61 20 73 6f 72 74 69 6e  created a sortin
ba80: 67 0a 2a 2a 20 69 6e 64 65 78 20 74 68 61 20 77  g.** index tha w
ba90: 65 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 6e  e ended up not n
baa0: 65 65 64 69 6e 67 2e 20 20 54 68 69 73 20 72 6f  eeding.  This ro
bab0: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
bac0: 61 74 0a 2a 2a 20 6f 70 63 6f 64 65 20 74 6f 20  at.** opcode to 
bad0: 4f 50 5f 4e 6f 6f 70 2e 0a 2a 2f 0a 73 74 61 74  OP_Noop..*/.stat
bae0: 69 63 20 76 6f 69 64 20 75 6e 63 72 65 61 74 65  ic void uncreate
baf0: 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72  SortingIndex(Par
bb00: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
bb10: 61 64 64 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  addr){.  Vdbe *v
bb20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bb30: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  ;.  VdbeOp *pOp 
bb40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
bb50: 4f 70 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 73  Op(v, addr);.  s
bb60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
bb70: 50 33 28 76 2c 20 61 64 64 72 2c 20 30 2c 20 30  P3(v, addr, 0, 0
bb80: 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  );.  pOp->opcode
bb90: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 70 4f   = OP_Noop;.  pO
bba0: 70 2d 3e 70 31 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p1 = 0;.  pOp
bbb0: 2d 3e 70 32 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  ->p2 = 0;.}..#if
bbc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bbd0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
bbe0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
bbf0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
bc00: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
bc10: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
bc20: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
bc30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
bc40: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
bc50: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
bc60: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
bc70: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
bc80: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
bc90: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
bca0: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
bcb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bcc0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
bcd0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
bce0: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
bcf0: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
bd00: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
bd10: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
bd20: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
bd30: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
bd40: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
bd50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
bd60: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
bd70: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
bd80: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
bd90: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
bda0: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
bdb0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
bdc0: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
bdd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bde0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Ret = 0;.  }.  i
bdf0: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
be00: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
be10: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
be20: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
be30: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
be40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
be50: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
be60: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
be70: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
be80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
be90: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
bea0: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
beb0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
bec0: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
bed0: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
bee0: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
bef0: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
bf00: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
bf10: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
bf20: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
bf30: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
bf40: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
bf50: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
bf60: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
bf70: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
bf80: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
bf90: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
bfa0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
bfb0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
bfc0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
bfd0: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
bfe0: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
bff0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
c000: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
c010: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
c020: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
c030: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
c040: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
c050: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
c060: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
c070: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
c080: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
c090: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
c0a0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
c0b0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
c0c0: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
c0d0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
c0e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
c0f0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
c100: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
c110: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
c120: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
c130: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
c140: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
c150: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
c160: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
c170: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
c180: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
c190: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
c1a0: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
c1b0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
c1c0: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
c1d0: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
c1e0: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
c1f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c200: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
c210: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
c220: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
c230: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
c240: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
c250: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
c260: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
c270: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
c280: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
c290: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
c2a0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
c2b0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
c2c0: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
c2d0: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
c2e0: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
c2f0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
c300: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
c310: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
c320: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c330: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
c340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c350: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
c360: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
c370: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44  oded */.  int eD
c380: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
c390: 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71  /* \___  Store q
c3a0: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20  uery results as 
c3b0: 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69  specified */.  i
c3c0: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
c3d0: 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79       /* /     by
c3e0: 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d   these two param
c3f0: 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a  eters.         *
c400: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
c410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
c420: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
c430: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
c440: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
c450: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c460: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
c470: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
c480: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
c490: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
c4a0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
c4b0: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
c4c0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
c4d0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
c4e0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
c4f0: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
c500: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
c510: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
c520: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c530: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
c540: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
c550: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
c560: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
c570: 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a  BY clause on p *
c580: 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32  /.  int aSetP2[2
c590: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ];        /* Set
c5a0: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65   P2 value of the
c5b0: 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20  se op to number 
c5c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
c5d0: 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20  int nSetP2 = 0; 
c5e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c5f0: 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74  of slots in aSet
c600: 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20  P2[] used */..  
c610: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
c620: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
c630: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
c640: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
c650: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
c660: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
c670: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
c680: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
c690: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
c6a0: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
c6b0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
c6c0: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
c6d0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
c6e0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c6f0: 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20  d;.  }.  pPrior 
c700: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
c710: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
c720: 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f  Rightmost!=pPrio
c730: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
c740: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
c750: 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t==p->pRightmost
c760: 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72   );.  if( pPrior
c770: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
c780: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
c790: 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
c7a0: 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
c7b0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
c7c0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
c7d0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
c7e0: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
c7f0: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
c800: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c810: 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
c820: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
c830: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c840: 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
c850: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
c860: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
c870: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
c880: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
c890: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
c8a0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c8b0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
c8c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
c8d0: 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75 65  have a valid que
c8e0: 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e  ry engine.  If n
c8f0: 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ot, create a new
c900: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   one..  */.  v =
c910: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c920: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
c930: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
c940: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
c950: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c960: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  }..  /* Create t
c970: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
c980: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
c990: 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
c9a0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
c9b0: 54 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a  T_VirtualTab ){.
c9c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c9d0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73  EList );.    ass
c9e0: 65 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65  ert( nSetP2<size
c9f0: 6f 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f  of(aSetP2)/sizeo
ca00: 66 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a  f(aSetP2[0]) );.
ca10: 20 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50      aSetP2[nSetP
ca20: 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  2++] = sqlite3Vd
ca30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
ca40: 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d  enVirtual, iParm
ca50: 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20  , 0);.    eDest 
ca60: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
ca70: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
ca80: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
ca90: 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
caa0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
cab0: 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   */.  pOrderBy =
cac0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
cad0: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
cae0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
caf0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  : {.      if( pO
cb00: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
cb10: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
cb20: 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  0;.        asser
cb30: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
cb40: 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
cb50: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
cb60: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
cb70: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
cb80: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
cb90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cba0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
cbb0: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
cbc0: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
cbd0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
cbe0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
cbf0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65         p->pOffse
cc00: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
cc10: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
cc20: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
cc30: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
cc40: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
cc50: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
cc60: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
cc70: 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
cc80: 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
cc90: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
cca0: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
ccb0: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
ccc0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
ccd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cce0: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
ccf0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30  ro, p->iLimit, 0
cd00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
cd10: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
cd20: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
cd30: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
cd40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
cd60: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
cd70: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
cd80: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
cd90: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
cda0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
cdb0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
cdc0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
cdd0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
cde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
cdf0: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
ce00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ce10: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
ce20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ce30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ce40: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20   }.      /* For 
ce50: 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52  UNION ALL ... OR
ce60: 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f  DER BY fall thro
ce70: 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ugh to the next 
ce80: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
ce90: 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
cea0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
ceb0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
cec0: 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
ced0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
cee0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
cef0: 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
cf00: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sult */.      in
cf10: 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f  t op = 0;      /
cf20: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
cf30: 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
cf40: 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
cf50: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
cf60: 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
cf70: 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
cf80: 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
cf90: 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
cfa0: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
cfb0: 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65  pOffset; /* Save
cfc0: 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e  d values of p->n
cfd0: 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66  Limit and p->nOf
cfe0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  fset */.      in
cff0: 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70  t addr;..      p
d000: 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d  riorOp = p->op==
d010: 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62  TK_ALL ? SRT_Tab
d020: 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  le : SRT_Union;.
d030: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
d040: 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64  =priorOp && pOrd
d050: 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70  erBy==0 && !p->p
d060: 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66  Limit && !p->pOf
d070: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
d080: 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20  /* We can reuse 
d090: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
d0a0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
d0b0: 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20   SELECT to our. 
d0c0: 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e         ** right.
d0d0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
d0e0: 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69      unionTab = i
d0f0: 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
d100: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
d110: 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
d120: 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
d130: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
d140: 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
d150: 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
d160: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
d170: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
d180: 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
d190: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
d1a0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
d1b0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
d1c0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20  lumn(pParse, p, 
d1d0: 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54  pOrderBy, unionT
d1e0: 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ab,1) ){.       
d1f0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
d200: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d210: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d220: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
d230: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
d250: 56 69 72 74 75 61 6c 2c 20 75 6e 69 6f 6e 54 61  Virtual, unionTa
d260: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
d270: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
d280: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
d290: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
d2a0: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
d2b0: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
d2c0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
d2d0: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
d2e0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
d2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d300: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
d310: 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20  rOpenVirt[0] == 
d320: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
d330: 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b  p->addrOpenVirt[
d340: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
d350: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
d360: 73 74 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 31  st->usesVirt = 1
d370: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d380: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
d390: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
d3a0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
d3b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d3c0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
d3d0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
d3e0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
d3f0: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
d400: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
d410: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
d420: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
d430: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d440: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d450: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
d460: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
d470: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
d480: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d490: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d4a0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
d4b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
d4c0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
d4d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
d4e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
d4f0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
d500: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
d510: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
d520: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
d530: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
d540: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
d550: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
d560: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
d570: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
d580: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
d590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d5a0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
d5b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
d5c0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
d5d0: 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72     p->disallowOr
d5e0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
d5f0: 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  !=0;.      pLimi
d600: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
d610: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
d620: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
d630: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
d640: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
d650: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
d660: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d670: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
d680: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
d690: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
d6a0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
d6b0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
d6c0: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
d6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d6e0: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
d6f0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
d700: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
d710: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
d720: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
d730: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
d740: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
d750: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  = -1;.      if( 
d760: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d770: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d780: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
d790: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
d7a0: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
d7b0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d7c0: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
d7d0: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
d7e0: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
d7f0: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
d800: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
d810: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
d820: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
d830: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
d840: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
d850: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
d860: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d870: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
d880: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
d890: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
d8a0: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
d8b0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
d8c0: 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a   0, p->pEList);.
d8d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d8e0: 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
d8f0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d900: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
d910: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
d920: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d930: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
d940: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
d950: 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
d960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d970: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
d980: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
d990: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
d9a0: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
d9b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d9c0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (v);.        rc 
d9d0: 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  = selectInnerLoo
d9e0: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
d9f0: 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
da00: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
da10: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65   pOrderBy, -1, e
da40: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
da70: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
da80: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
da90: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
daa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
dab0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
dac0: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
dad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dae0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
daf0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
db00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db10: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
db20: 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a  onTab, iStart);.
db30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
db40: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
db50: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
db60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db70: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  ddOp(v, OP_Close
db80: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
db90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
dba0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
dbb0: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
dbc0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  : {.      int ta
dbd0: 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
dbe0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
dbf0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
dc00: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
dc10: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
dc20: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
dc30: 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
dc40: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
dc50: 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
dc60: 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
dc70: 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
dc80: 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
dc90: 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
dca0: 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
dcb0: 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
dcc0: 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
dcd0: 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
dce0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
dcf0: 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
dd00: 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
dd10: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
dd20: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
dd30: 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65  rBy && matchOrde
dd40: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
dd50: 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61  se,p,pOrderBy,ta
dd60: 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20  b1,1) ){.       
dd70: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
dd80: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
dd90: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
dda0: 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72 74        createSort
ddb0: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
ddc0: 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a   p, pOrderBy);..
ddd0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
dde0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ddf0: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
de00: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
de10: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
de20: 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 3d 20 2d  OpenVirt[0] == -
de30: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
de40: 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20  drOpenVirt[0] = 
de50: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
de60: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 56  Rightmost->usesV
de70: 69 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  irt = 1;.      a
de80: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
de90: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
dea0: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
deb0: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
dec0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ded0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
dee0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
def0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
df00: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
df10: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
df20: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
df30: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
df40: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
df50: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
df60: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
df70: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
df80: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
df90: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
dfa0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
dfb0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
dfc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
dfd0: 56 69 72 74 75 61 6c 2c 20 74 61 62 32 2c 20 30  Virtual, tab2, 0
dfe0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dff0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
e000: 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
e010: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
e020: 72 74 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[1] = addr;.  
e030: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e040: 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
e050: 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
e060: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
e070: 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
e080: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
e090: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
e0a0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
e0b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
e0c0: 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e 69 6f  rse, p, SRT_Unio
e0d0: 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c 20 30  n, tab2, 0, 0, 0
e0e0: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d  , aff);.      p-
e0f0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
e100: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e110: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
e120: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
e130: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
e140: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e150: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
e160: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
e170: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e180: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e190: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
e1a0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
e1b0: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
e1c0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
e1d0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
e1e0: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
e1f0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
e200: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
e210: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
e220: 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
e230: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43         generateC
e240: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
e250: 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74 29  e, 0, p->pEList)
e260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e270: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
e280: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e290: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
e2a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e2b0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
e2c0: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
e2d0: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
e2e0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
e2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e300: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
e310: 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
e320: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
e330: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e340: 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c  OP_RowKey, tab1,
e350: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e360: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e370: 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32  P_NotFound, tab2
e380: 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
e390: 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
e3a0: 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
e3b0: 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
e3c0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e3d0: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44  pOrderBy, -1, eD
e400: 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c            iCont,
e430: 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20   iBreak, 0);.   
e440: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e450: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
e460: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e470: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e480: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e490: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e4a0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
e4b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e4c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
e4d0: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
e4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e4f0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e500: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
e510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e520: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
e530: 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  2, 0);.      sql
e540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
e550: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c   OP_Close, tab1,
e560: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
e570: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e580: 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
e590: 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
e5a0: 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
e5b0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
e5c0: 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
e5d0: 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
e5e0: 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
e5f0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
e600: 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
e610: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
e620: 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
e630: 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
e640: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e650: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e660: 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
e670: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
e680: 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
e690: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
e6a0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
e6b0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
e6c0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
e6d0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
e6e0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e6f0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
e700: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
e710: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
e720: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
e730: 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d  es.  */.  nCol =
e740: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e750: 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74  r;.  while( nSet
e760: 50 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  P2 ){.    sqlite
e770: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
e780: 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32   aSetP2[--nSetP2
e790: 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20  ], nCol);.  }.. 
e7a0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
e7b0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
e7c0: 75 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74  used by either t
e7d0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
e7e0: 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e  se or.  ** by an
e7f0: 79 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  y temporary tabl
e800: 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
e810: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
e820: 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
e830: 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
e840: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
e850: 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
e860: 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74  ables.  Invoke t
e870: 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  he.  ** ORDER BY
e880: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74   processing if t
e890: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
e8a0: 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a   BY clause..  **
e8b0: 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
e8c0: 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
e8d0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
e8e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
e8f0: 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
e900: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
e910: 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
e920: 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
e930: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
e940: 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
e950: 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
e960: 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
e970: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e980: 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
e990: 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
e9a0: 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
e9b0: 20 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e   pOrderBy || p->
e9c0: 75 73 65 73 56 69 72 74 20 29 7b 0a 20 20 20 20  usesVirt ){.    
e9d0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ea00: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
ea10: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
ea20: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
ea30: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
ea40: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
ea50: 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
ea60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea70: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
ea80: 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
ea90: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
eaa0: 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
eab0: 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  l;.    CollSeq *
eac0: 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20 61 73 73  *aCopy;..    ass
ead0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
eae0: 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 4b 65  st==p );.    pKe
eaf0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  yInfo = sqliteMa
eb00: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65  lloc(sizeof(*pKe
eb10: 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 32 2a 73 69  yInfo)+nCol*2*si
eb20: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
eb30: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   nCol);.    if( 
eb40: 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
eb50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
eb60: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
eb70: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
eb80: 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b  d;.    }..    pK
eb90: 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 70 50  eyInfo->enc = pP
eba0: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
ebb0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
ebc0: 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
ebd0: 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
ebe0: 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
ebf0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
ec00: 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
ec10: 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
ec20: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
ec30: 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
ec40: 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
ec50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
ec60: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
ec70: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
ec80: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ec90: 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
eca0: 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
ecb0: 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
ecc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
ecd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
ece0: 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
ecf0: 64 72 4f 70 65 6e 56 69 72 74 5b 69 5d 3b 0a 20  drOpenVirt[i];. 
ed00: 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
ed10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
ed20: 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
ed30: 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
ed40: 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
ed50: 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
ed60: 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
ed70: 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
ed80: 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
ed90: 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
eda0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
edb0: 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
edc0: 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 3c 30 20  drOpenVirt[1]<0 
edd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
ede0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
edf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ee00: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
ee10: 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
ee20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ee30: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
ee40: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
ee50: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P3_KEYINFO);.   
ee60: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ee70: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
ee80: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
ee90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
eea0: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
eeb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
eec0: 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
eed0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
eee0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
eef0: 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
ef00: 3b 0a 0a 20 20 20 20 20 20 61 43 6f 70 79 20 3d  ;..      aCopy =
ef10: 20 28 43 6f 6c 6c 53 65 71 2a 2a 29 26 70 4b 65   (CollSeq**)&pKe
ef20: 79 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 20 20  yInfo[1];.      
ef30: 70 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  pSortOrder = pKe
ef40: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
ef50: 72 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b  r = (u8*)&aCopy[
ef60: 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  nCol];.      mem
ef70: 63 70 79 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  cpy(aCopy, pKeyI
ef80: 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
ef90: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
efa0: 29 29 3b 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c  ));.      apColl
efb0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
efc0: 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ll;.      for(i=
efd0: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78 70  0; i<nOrderByExp
efe0: 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b  r; i++, pOTerm++
eff0: 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72  , apColl++, pSor
f000: 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20  tOrder++){.     
f010: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
f020: 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a   pOTerm->pExpr;.
f030: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
f040: 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a 4e  ame = pOTerm->zN
f050: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
f060: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
f070: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
f080: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c  pr->iColumn<nCol
f090: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f0a0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
f0b0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71 6c     *apColl = sql
f0c0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
f0d0: 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  q(pParse, zName,
f0e0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   -1);.        }e
f0f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
f100: 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
f110: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
f120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f130: 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
f140: 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
f150: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
f160: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
f170: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
f180: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f190: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d 30  drOpenVirt[2]>=0
f1a0: 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
f1b0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
f1c0: 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
f1d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
f1e0: 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73  , addr, p->pELis
f1f0: 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  t->nExpr+2);.   
f200: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
f210: 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78  eld = nOrderByEx
f220: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
f230: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
f240: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
f250: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
f260: 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
f270: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b     pKeyInfo = 0;
f280: 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
f290: 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
f2a0: 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
f2b0: 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
f2c0: 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Parm);.    }..  
f2d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
f2e0: 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
f2f0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
f300: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f310: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f320: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
f330: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
f340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
f350: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
f360: 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
f370: 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
f380: 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
f390: 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
f3a0: 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
f3b0: 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
f3c0: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
f3d0: 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
f3e0: 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
f3f0: 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
f400: 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
f410: 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
f420: 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
f430: 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
f440: 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
f450: 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
f460: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
f470: 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
f480: 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
f490: 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
f4a0: 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
f4b0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
f4c0: 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
f4d0: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
f4e0: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
f4f0: 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
f500: 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
f510: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
f520: 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
f530: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
f540: 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
f550: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
f560: 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
f570: 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
f580: 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
f590: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
f5a0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
f5b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f5c0: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
f5d0: 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
f5e0: 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
f5f0: 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
f600: 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
f610: 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  ct(Select *, int
f620: 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20  , ExprList *);  
f630: 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
f640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f650: 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
f660: 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
f670: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
f680: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
f690: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
f6a0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
f6b0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
f6c0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
f6d0: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
f6e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
f6f0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
f700: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
f710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
f720: 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
f730: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
f740: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
f750: 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
f760: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f770: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
f780: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
f790: 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
f7a0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
f7b0: 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
f7c0: 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
f7d0: 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
f7e0: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
f7f0: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
f800: 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
f810: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
f820: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
f830: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
f840: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
f850: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
f860: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f870: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
f880: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
f890: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
f8a0: 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
f8b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
f8c0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
f8d0: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
f8e0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
f8f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
f900: 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pNew->pList);. 
f910: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
f920: 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
f930: 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
f940: 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
f950: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
f960: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
f970: 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
f980: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
f990: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
f9a0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
f9b0: 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
f9c0: 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
f9d0: 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
f9e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53  .      pExpr->pS
f9f0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
fa00: 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70  electDup(pNew->p
fa10: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
fa20: 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
fa30: 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
fa40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
fa50: 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
fa60: 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
fa70: 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
fa80: 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67  Expr(pExpr->pRig
fa90: 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
faa0: 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65  st);.    substSe
fab0: 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c  lect(pExpr->pSel
fac0: 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
fad0: 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
fae0: 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
faf0: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
fb00: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
fb10: 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
fb20: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
fb30: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62  *pList, int iTab
fb40: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
fb50: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
fb60: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
fb70: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
fb80: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
fb90: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
fba0: 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
fbb0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
fbc0: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
fbd0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
fbe0: 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
fbf0: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
fc00: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
fc10: 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72  t){.  if( !p ) r
fc20: 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
fc30: 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
fc40: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
fc50: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
fc60: 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
fc70: 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
fc80: 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
fc90: 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54  (p->pOrderBy, iT
fca0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
fcb0: 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
fcc0: 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
fcd0: 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
fce0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
fcf0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
fd00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
fd10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
fd20: 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64  _VIEW) */..#ifnd
fd30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
fd40: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  IEW./*.** This r
fd50: 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
fd60: 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
fd70: 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
fd80: 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
fd90: 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
fda0: 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
fdb0: 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
fdc0: 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
fdd0: 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
fde0: 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
fdf0: 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
fe00: 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
fe10: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
fe20: 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
fe30: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
fe40: 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
fe50: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
fe60: 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
fe70: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
fe80: 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
fe90: 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
fea0: 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
feb0: 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
fec0: 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
fed0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
fee0: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
fef0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
ff00: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
ff10: 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
ff20: 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
ff30: 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
ff40: 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
ff50: 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
ff60: 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
ff70: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
ff80: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
ff90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
ffa0: 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
ffb0: 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
ffc0: 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
ffd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ffe0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
fff0: 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
10000 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
10010 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
10020 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
10030 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
10040 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
10050 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
10060 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
10070 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
10080 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
10090 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
100a0 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
100b0 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
100c0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
100d0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
100e0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
100f0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
10100 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
10110 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
10120 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
10130 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
10140 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
10150 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
10160 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
10170 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
10180 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
10190 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
101a0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
101b0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
101c0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
101d0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
101e0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
101f0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
10200 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10210 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
10220 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
10230 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
10240 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
10250 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
10260 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20  er join, or.**  
10270 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65        the subque
10280 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
10290 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65   a join.  (Ticke
102a0 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20  t #306).**.**   
102b0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
102c0 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
102d0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
102e0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
102f0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
10300 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
10310 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
10320 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10330 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
10340 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
10350 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
10360 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
10370 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
10380 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
10390 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
103a0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
103b0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
103c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
103d0 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
103e0 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
103f0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
10400 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
10410 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
10420 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
10430 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
10440 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
10450 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
10460 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10470 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
10480 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
10490 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
104a0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
104b0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
104c0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
104d0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
104e0 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
104f0 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
10500 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
10510 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
10520 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
10530 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
10540 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
10550 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
10560 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
10570 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
10580 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74   OUTER JOIN or t
10590 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
105a0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
105b0 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64  RE clause.  (add
105c0 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
105d0 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  0).**.** In this
105e0 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
105f0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
10600 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10610 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
10620 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
10630 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
10640 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
10650 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
10660 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
10670 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
10680 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
10690 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
106a0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
106b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
106c0 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
106d0 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
106e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
106f0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
10700 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
10710 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
10720 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
10730 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
10740 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
10750 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
10760 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
10770 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
10780 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
10790 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
107a0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
107b0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
107c0 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
107d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
107e0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
107f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10800 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
10810 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
10820 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
10830 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
10840 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
10850 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
10860 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
10870 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
10880 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
10890 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
108a0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
108b0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
108c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
108d0 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
108e0 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
108f0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
10900 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
10910 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
10920 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
10930 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
10940 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
10950 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
10960 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
10970 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
10980 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
10990 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
109a0 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
109b0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
109c0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
109d0 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
109e0 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
109f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
10a00 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10a10 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
10a20 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
10a30 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
10a40 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
10a50 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
10a60 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
10a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10a80 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
10a90 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
10ac0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
10ad0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
10ae0 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
10af0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20   subquery */..  
10b00 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
10b10 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
10b20 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
10b30 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
10b40 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  */.  if( p==0 ) 
10b50 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
10b60 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
10b70 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
10b80 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
10b90 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
10ba0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
10bb0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53  ->a[iFrom];.  pS
10bc0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
10bd0 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
10be0 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
10bf0 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
10c00 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
10c10 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 75 62 71  rn 0;.  if( subq
10c20 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
10c30 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
10c40 72 6e 20 30 3b 0a 20 20 70 53 75 62 53 72 63 20  rn 0;.  pSubSrc 
10c50 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
10c60 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
10c70 29 3b 0a 20 20 69 66 28 20 28 70 53 75 62 2d 3e  );.  if( (pSub->
10c80 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
10c90 6d 69 74 29 20 7c 7c 20 70 53 75 62 2d 3e 70 4f  mit) || pSub->pO
10ca0 66 66 73 65 74 20 7c 7c 20 0a 20 20 20 20 20 20  ffset || .      
10cb0 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26  (pSub->pLimit &&
10cc0 20 69 73 41 67 67 29 20 29 20 72 65 74 75 72 6e   isAgg) ) return
10cd0 20 30 3b 0a 20 20 69 66 28 20 70 53 75 62 53 72   0;.  if( pSubSr
10ce0 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74  c->nSrc==0 ) ret
10cf0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
10d00 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26  b->isDistinct &&
10d10 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
10d20 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
10d30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
10d40 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e   if( p->isDistin
10d50 63 74 20 26 26 20 73 75 62 71 75 65 72 79 49 73  ct && subqueryIs
10d60 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Agg ) return 0;.
10d70 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c    if( (p->disall
10d80 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e  owOrderBy || p->
10d90 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53 75  pOrderBy) && pSu
10da0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
10db0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65  turn 0;..  /* Re
10dc0 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66  striction 3:  If
10dd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10de0 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75   a join, make su
10df0 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
10e00 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65  is .  ** not use
10e10 64 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f  d as the right o
10e20 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74  perand of an out
10e30 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c  er join.  Exampl
10e40 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  es of why this. 
10e50 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77   ** is not allow
10e60 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
10e70 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
10e80 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
10e90 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
10ea0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
10eb0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
10ec0 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
10ed0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
10ee0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
10ef0 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
10f00 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
10f10 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
10f20 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
10f30 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
10f40 20 26 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28   && iFrom>0 && (
10f50 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d  pSrc->a[iFrom-1]
10f60 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
10f70 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
10f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
10f90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
10fa0 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
10fb0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
10fc0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
10fd0 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
10fe0 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
10ff0 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
11000 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
11010 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
11020 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
11030 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
11040 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
11050 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
11060 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
11070 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
11080 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
11090 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
110a0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
110b0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
110c0 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
110d0 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
110e0 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
110f0 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
11100 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
11110 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
11120 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
11130 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
11140 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
11150 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
11160 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
11170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f  .  */.  if( iFro
11180 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b  m>0 && (pSrc->a[
11190 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70  iFrom-1].jointyp
111a0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
111b0 20 0a 20 20 20 20 20 20 26 26 20 70 53 75 62 2d   .      && pSub-
111c0 3e 70 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20  >pWhere!=0 ){.  
111d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
111e0 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
111f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
11200 20 6d 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e   means flattenin
11210 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 66  g is permitted f
11220 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f  or the.  ** iFro
11230 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
11240 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
11250 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11260 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76  ..  */..  /* Mov
11270 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  e all of the FRO
11280 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
11290 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
112a0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
112b0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
112c0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
112d0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
112e0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
112f0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
11300 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
11310 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
11320 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
11330 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
11340 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
11350 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
11360 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
11370 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
11380 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
11390 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
113a0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
113b0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
113c0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
113d0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
113e0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
113f0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
11400 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
11410 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
11420 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
11430 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
11440 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b  em->iCursor;.  {
11450 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
11460 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
11470 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79  ;.    int jointy
11480 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
11490 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20 20 73 71  ointype;..    sq
114a0 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
114b0 28 30 2c 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  (0, pSubitem->pT
114c0 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  ab);.    sqliteF
114d0 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ree(pSubitem->zD
114e0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
114f0 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74 65  liteFree(pSubite
11500 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
11510 71 6c 69 74 65 46 72 65 65 28 70 53 75 62 69 74  qliteFree(pSubit
11520 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
11530 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
11540 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74 72  {.      int extr
11550 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31 3b  a = nSubSrc - 1;
11560 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
11570 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
11580 0a 20 20 20 20 20 20 20 20 70 53 72 63 20 3d 20  .        pSrc = 
11590 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
115a0 70 65 6e 64 28 70 53 72 63 2c 20 30 2c 20 30 29  pend(pSrc, 0, 0)
115b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
115c0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
115d0 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63        for(i=pSrc
115e0 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65 78 74 72  ->nSrc-1; i-extr
115f0 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a  a>=iFrom; i--){.
11600 20 20 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b          pSrc->a[
11610 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65  i] = pSrc->a[i-e
11620 78 74 72 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra];.      }. 
11630 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
11640 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
11650 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
11660 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
11670 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
11680 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
11690 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
116a0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
116b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
116c0 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53  c->a[iFrom+nSubS
116d0 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
116e0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a   jointype;.  }..
116f0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
11700 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
11710 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
11720 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
11730 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
11740 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
11750 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
11760 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45  ry..  ** .  ** E
11770 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
11780 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
11790 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
117a0 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
117b0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
117c0 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20  HERE a>b;.  **  
117d0 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
117e0 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
117f0 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
11800 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
11810 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f      /.  **    \_
11820 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
11830 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
11840 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
11850 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
11860 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f  .  **.  ** We lo
11870 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
11880 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
11890 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
118a0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
118b0 0a 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62  .  ** "a" we sub
118c0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
118d0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
118e0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
118f0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
11900 20 2a 2f 0a 20 20 73 75 62 73 74 45 78 70 72 4c   */.  substExprL
11910 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69  ist(p->pEList, i
11920 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
11930 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d  List);.  pList =
11940 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f   p->pEList;.  fo
11950 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
11960 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
11970 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
11980 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
11990 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
119a0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
119b0 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
119c0 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  z!=0 ){.      pL
119d0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
119e0 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
119f0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70  (char*)pExpr->sp
11a00 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
11a10 6e 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n.n);.    }.  }.
11a20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
11a30 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
11a40 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  (p->pGroupBy, iP
11a50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
11a60 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
11a70 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
11a80 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
11a90 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  EList);.  }.  if
11aa0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
11ab0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11ac0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
11ad0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
11ae0 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
11af0 42 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f  By;.    pSub->pO
11b00 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
11b10 6c 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  lse if( p->pOrde
11b20 72 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74  rBy ){.    subst
11b30 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
11b40 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
11b50 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
11b60 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57  }.  if( pSub->pW
11b70 68 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65  here ){.    pWhe
11b80 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
11b90 44 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65  Dup(pSub->pWhere
11ba0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11bb0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
11bc0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
11bd0 41 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Agg ){.    asser
11be0 74 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  t( p->pHaving==0
11bf0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69   );.    p->pHavi
11c00 6e 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  ng = p->pWhere;.
11c10 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
11c20 70 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73  pWhere;.    subs
11c30 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
11c40 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
11c50 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
11c60 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
11c70 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61  e3ExprAnd(p->pHa
11c80 76 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70  ving, sqlite3Exp
11c90 72 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69  rDup(pSub->pHavi
11ca0 6e 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ng));.    assert
11cb0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
11cc0 20 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75   );.    p->pGrou
11cd0 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
11ce0 72 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70  rListDup(pSub->p
11cf0 47 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73  GroupBy);.  }els
11d00 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
11d10 28 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  (p->pWhere, iPar
11d20 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
11d30 74 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  t);.    p->pWher
11d40 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
11d50 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57  nd(p->pWhere, pW
11d60 68 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  here);.  }..  /*
11d70 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
11d80 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
11d90 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
11da0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a  nner or the.  **
11db0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
11dc0 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a  distinct. .  */.
11dd0 20 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20    p->isDistinct 
11de0 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20  = p->isDistinct 
11df0 7c 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  || pSub->isDisti
11e00 6e 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  nct;..  /*.  ** 
11e10 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
11e20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
11e30 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
11e40 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
11e50 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
11e60 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
11e70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
11e80 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75  >pLimit;.    pSu
11e90 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
11ea0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
11eb0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
11ec0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
11ed0 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
11ee0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
11ef0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
11f00 6c 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29  lectDelete(pSub)
11f10 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
11f20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11f30 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
11f40 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
11f50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11f60 74 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61  t passed in as a
11f70 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65  n argument to se
11f80 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20  e if it.** is a 
11f90 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
11fa0 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66  max() query.  If
11fb0 20 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20   it is and this 
11fc0 71 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20  query can be.** 
11fd0 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20  satisfied using 
11fe0 61 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f  a single seek to
11ff0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12000 72 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65  r end of an inde
12010 78 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72  x,.** then gener
12020 61 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72  ate the code for
12030 20 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64   this SELECT and
12040 20 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74   return 1.  If t
12050 68 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a  his is not a .**
12060 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72   simple min() or
12070 20 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68   max() query, th
12080 65 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a  en return 0;.**.
12090 2a 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28  ** A simply min(
120a0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
120b0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
120c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
120d0 54 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61  T min(a) FROM ta
120e0 62 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ble;.**    SELEC
120f0 54 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61  T max(a) FROM ta
12100 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71  ble;.**.** The q
12110 75 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e  uery may have on
12120 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
12130 65 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72  e in its FROM ar
12140 67 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a  gument.  There.*
12150 2a 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55  * can be no GROU
12160 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f  P BY or HAVING o
12170 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  r WHERE clauses.
12180 20 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74    The result set
12190 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20   must.** be the 
121a0 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f  min() or max() o
121b0 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
121c0 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  n of the table. 
121d0 20 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   The column.** i
121e0 6e 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  n the min() or m
121f0 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ax() function mu
12200 73 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a  st be indexed..*
12210 2a 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74  *.** The paramet
12220 65 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ers to this rout
12230 69 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ine are the same
12240 20 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53   as for sqlite3S
12250 65 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20  elect()..** See 
12260 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
12270 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
12280 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
12290 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
122a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d  /.static int sim
122b0 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50  pleMinMaxQuery(P
122c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
122d0 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65  lect *p, int eDe
122e0 73 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a  st, int iParm){.
122f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
12300 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62   int iCol;.  Tab
12310 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65  le *pTab;.  Inde
12320 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62  x *pIdx;.  int b
12330 61 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ase;.  Vdbe *v;.
12340 20 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20    int seekOp;.  
12350 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
12360 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b  , *pList, eList;
12370 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
12380 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65  st_item eListIte
12390 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  m;.  SrcList *pS
123a0 72 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20  rc;.  int brk;. 
123b0 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20   int iDb;..  /* 
123c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
123d0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20  this query is a 
123e0 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
123f0 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65  max() query.  Re
12400 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69  turn.  ** zero i
12410 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20  f it is  not..  
12420 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  */.  if( p->pGro
12430 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69  upBy || p->pHavi
12440 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20  ng || p->pWhere 
12450 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
12460 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
12470 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
12480 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
12490 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
124a0 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
124b0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
124c0 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d  urn 0;.  pExpr =
124d0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
124e0 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
124f0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
12500 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
12510 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  ;.  pList = pExp
12520 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20  r->pList;.  if( 
12530 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
12540 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
12550 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
12560 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
12570 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12580 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
12590 70 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e  p((char*)pExpr->
125a0 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29  token.z,"min",3)
125b0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f  ==0 ){.    seekO
125c0 70 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20  p = OP_Rewind;. 
125d0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
125e0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
125f0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
12600 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
12610 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
12620 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
12630 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12640 0a 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74  .  pExpr = pList
12650 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
12660 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
12670 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  K_COLUMN ) retur
12680 6e 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45  n 0;.  iCol = pE
12690 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
126a0 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
126b0 5d 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f 2a 20 49  ].pTab;...  /* I
126c0 66 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65  f we get to here
126d0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71  , it means the q
126e0 75 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63  uery is of the c
126f0 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a  orrect form..  *
12700 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
12710 73 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20  sure we have an 
12720 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70  index and make p
12730 49 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  Idx point to the
12740 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74  .  ** appropriat
12750 65 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65  e index.  If the
12760 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
12770 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52  is on an INTEGER
12780 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65   PRIMARY.  ** ke
12790 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64  y column, no ind
127a0 65 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ex is necessary 
127b0 73 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e  so set pIdx to N
127c0 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a  ULL.  If no.  **
127d0 20 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73   usable index is
127e0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30   found, return 0
127f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f  ..  */.  if( iCo
12800 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20  l<0 ){.    pIdx 
12810 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12820 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
12830 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12840 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
12850 78 70 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 49  xpr);.    for(pI
12860 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
12870 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
12880 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
12890 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
128a0 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20  olumn>=1 );.    
128b0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
128c0 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26  lumn[0]==iCol &&
128d0 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61   pIdx->keyInfo.a
128e0 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29  Coll[0]==pColl )
128f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12900 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
12910 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
12920 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
12930 75 6d 6e 20 74 79 70 65 73 20 69 66 20 77 65 20  umn types if we 
12940 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 74 68  will be using th
12950 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  e callback.  Thi
12960 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
12970 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
12980 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
12990 20 61 20 74 61 62 6c 65 20 6f 72 20 61 20 6d 65   a table or a me
129a0 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20  mory cell..  ** 
129b0 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
129c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
129d0 65 6e 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20  en generated in 
129e0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
129f0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  tion..  */.  v =
12a00 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12a10 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
12a20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12a30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
12a40 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
12a50 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
12a60 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
12a70 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
12a80 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 56 69  f( eDest==SRT_Vi
12a90 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20 20 20  rtualTab ){.    
12aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ab0 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
12ac0 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  al, iParm, 1);. 
12ad0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12ae0 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
12af0 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
12b00 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
12b10 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
12b20 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
12b30 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
12b40 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
12b50 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
12b60 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
12b70 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
12b80 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
12b90 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
12ba0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
12bb0 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
12bc0 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
12bd0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20  ble..  */.  iDb 
12be0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12bf0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
12c00 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
12c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
12c20 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
12c30 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
12c40 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
12c50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
12c60 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
12c70 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20 3d  zName);.  base =
12c80 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
12c90 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71 6c  sor;.  brk = sql
12ca0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12cb0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
12cc0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12cd0 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a 20  arse, p, brk);. 
12ce0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
12cf0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
12d00 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
12d10 6c 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  le(pParse, base,
12d20 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
12d30 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20 20  penRead);.  }.  
12d40 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
12d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d60 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62  dOp(v, seekOp, b
12d70 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ase, 0);.  }else
12d80 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68  {.    /* Even th
12d90 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20  ough the cursor 
12da0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
12db0 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63   index here is c
12dc0 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20  losed.    ** as 
12dd0 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65  soon as a single
12de0 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20   value has been 
12df0 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c  read from it, al
12e00 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  locate it.    **
12e10 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e   using (pParse->
12e20 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65  nTab++) to preve
12e30 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64  nt the cursor id
12e40 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20   from being .   
12e50 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73   ** reused. This
12e60 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f   is important fo
12e70 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20  r statements of 
12e80 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a  the form .    **
12e90 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20   "INSERT INTO x 
12ea0 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f  SELECT max() FRO
12eb0 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  M x"..    */.   
12ec0 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 69   int iIdx;.    i
12ed0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
12ee0 61 62 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ab++;.    assert
12ef0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
12f00 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
12f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12f20 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
12f30 65 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20  eger, iDb, 0);. 
12f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
12f50 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  3(v, OP_OpenRead
12f60 2c 20 69 49 64 78 2c 20 70 49 64 78 2d 3e 74 6e  , iIdx, pIdx->tn
12f70 75 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  um,.            
12f80 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70         (char*)&p
12f90 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2c 20 50 33  Idx->keyInfo, P3
12fa0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 69  _KEYINFO);.    i
12fb0 66 28 20 73 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65  f( seekOp==OP_Re
12fc0 77 69 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  wind ){.      sq
12fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12fe0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29  , OP_Null, 0, 0)
12ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13000 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13010 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 29  akeRecord, 1, 0)
13020 3b 0a 20 20 20 20 20 20 73 65 65 6b 4f 70 20 3d  ;.      seekOp =
13030 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20 20 20   OP_MoveGt;.    
13040 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
13050 65 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70  eAddOp(v, seekOp
13060 2c 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  , iIdx, 0);.    
13070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13080 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
13090 20 69 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 73   iIdx, 0);.    s
130a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
130b0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
130c0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
130d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
130e0 50 5f 4d 6f 76 65 47 65 2c 20 62 61 73 65 2c 20  P_MoveGe, base, 
130f0 30 29 3b 0a 20 20 7d 0a 20 20 65 4c 69 73 74 2e  0);.  }.  eList.
13100 6e 45 78 70 72 20 3d 20 31 3b 0a 20 20 6d 65 6d  nExpr = 1;.  mem
13110 73 65 74 28 26 65 4c 69 73 74 49 74 65 6d 2c 20  set(&eListItem, 
13120 30 2c 20 73 69 7a 65 6f 66 28 65 4c 69 73 74 49  0, sizeof(eListI
13130 74 65 6d 29 29 3b 0a 20 20 65 4c 69 73 74 2e 61  tem));.  eList.a
13140 20 3d 20 26 65 4c 69 73 74 49 74 65 6d 3b 0a 20   = &eListItem;. 
13150 20 65 4c 69 73 74 2e 61 5b 30 5d 2e 70 45 78 70   eList.a[0].pExp
13160 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 73 65 6c  r = pExpr;.  sel
13170 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
13180 72 73 65 2c 20 70 2c 20 26 65 4c 69 73 74 2c 20  rse, p, &eList, 
13190 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 65 44 65  0, 0, 0, -1, eDe
131a0 73 74 2c 20 69 50 61 72 6d 2c 20 62 72 6b 2c 20  st, iParm, brk, 
131b0 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  brk, 0);.  sqlit
131c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
131d0 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 73 71  el(v, brk);.  sq
131e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
131f0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65  , OP_Close, base
13200 2c 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  , 0);.  .  retur
13210 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 1;.}../*.** An
13220 61 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20  alyze and ORDER 
13230 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
13240 6c 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43  lause in a SELEC
13250 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
13260 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
13270 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
13280 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45  n..**.** An ORDE
13290 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
132a0 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
132b0 70 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61  pressions.  If a
132c0 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ny expression.**
132d0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
132e0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
132f0 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  at expression is
13300 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
13310 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
13320 67 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  g entry in the r
13330 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
13340 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
13350 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20  OrderGroupBy(.  
13360 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
13370 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  ,     /* Name co
13380 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
13390 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  ECT statement. *
133a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
133b0 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65  rderBy,   /* The
133c0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
133d0 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
133e0 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  be processed */.
133f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13400 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
13410 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
13420 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
13430 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
13440 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   i;.  ExprList *
13450 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45  pEList = pNC->pE
13460 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65  List;     /* The
13470 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
13480 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50  he SELECT */.  P
13490 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
134a0 4e 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  NC->pParse;     
134b0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
134c0 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
134d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  */.  assert( pEL
134e0 69 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f  ist );..  if( pO
134f0 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
13500 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
13510 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
13520 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  pr; i++){.    in
13530 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72  t iCol;.    Expr
13540 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
13550 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
13560 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13570 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
13580 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Col) ){.      if
13590 28 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c  ( iCol>0 && iCol
135a0 3c 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  <=pEList->nExpr 
135b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
135c0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
135d0 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
135e0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
135f0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
13600 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
13610 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
13620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13630 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13640 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
13650 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63          "%s BY c
13660 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20  olumn number %d 
13670 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
13680 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20  hould be ".     
13690 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31        "between 1
136a0 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c   and %d", zType,
136b0 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e   iCol, pEList->n
136c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72  Expr);.        r
136d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
136e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
136f0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
13700 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20  eNames(pNC, pE) 
13710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13720 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
13730 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
13740 6e 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20  nstant(pE) ){.  
13750 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13760 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
13770 20 20 20 20 20 20 22 25 73 20 42 59 20 74 65 72        "%s BY ter
13780 6d 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e  ms must not be n
13790 6f 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  on-integer const
137a0 61 6e 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ants", zType);. 
137b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
137c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
137d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
137e0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c  is routine resol
137f0 76 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73  ves any names us
13800 65 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ed in the result
13810 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73   set of the.** s
13820 75 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73  upplied SELECT s
13830 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65  tatement. If the
13840 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13850 74 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64  t being resolved
13860 0a 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c  .** is a sub-sel
13870 65 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72  ect, then pOuter
13880 4e 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  NC is a pointer 
13890 74 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65  to the NameConte
138a0 78 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  xt .** of the pa
138b0 72 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  rent SELECT..*/.
138c0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
138d0 74 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73  tResolve(.  Pars
138e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
138f0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
13900 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
13910 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13920 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
13930 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
13940 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
13950 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
13960 65 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74  erNC  /* The out
13970 65 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  er name context.
13980 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
13990 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
139a0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
139b0 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20   /* Result set. 
139c0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 2f 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69  /* For-loop vari
139f0 61 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c  able used in mul
13a00 74 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a  tiple places */.
13a10 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
13a20 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C;           /* 
13a30 4c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  Local name-conte
13a40 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
13a50 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
13a60 20 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20     /* The group 
13a70 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20  by clause */..  
13a80 2f 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  /* If this routi
13a90 6e 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72  ne has run befor
13aa0 65 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  e, return immedi
13ab0 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  ately. */.  if( 
13ac0 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b  p->isResolved ){
13ad0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f  .    assert( !pO
13ae0 75 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65  uterNC );.    re
13af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b00 20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c    }.  p->isResol
13b10 76 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ved = 1;..  /* I
13b20 66 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72  f there have alr
13b30 65 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73  eady been errors
13b40 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f  , do nothing. */
13b50 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
13b60 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Err>0 ){.    ret
13b70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13b80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  ;.  }..  /* Prep
13b90 61 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73  are the select s
13ba0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63  tatement. This c
13bb0 61 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74  all will allocat
13bc0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20  e all cursors.  
13bd0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  ** required to h
13be0 61 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73  andle the tables
13bf0 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
13c00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
13c10 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  se..  */.  if( p
13c20 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
13c30 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
13c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13c50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ROR;.  }..  /* R
13c60 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
13c70 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
13c80 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
13c90 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
13ca0 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
13cb0 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
13cc0 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
13cd0 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
13ce0 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ontext..  */.  m
13cf0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
13d00 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
13d10 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
13d20 73 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  se;.  if( sqlite
13d30 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13d40 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
13d50 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69  t) ||.      sqli
13d60 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
13d70 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66  mes(&sNC, p->pOf
13d80 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
13d90 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13da0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
13db0 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
13dc0 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
13dd0 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65  s to ExprResolve
13de0 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20  Names() to.  ** 
13df0 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  resolve the expr
13e00 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a  ession-list..  *
13e10 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67  /.  sNC.allowAgg
13e20 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63   = 1;.  sNC.pSrc
13e30 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
13e40 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
13e50 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65  uterNC;..  /* Re
13e60 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
13e70 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
13e80 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
13e90 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70  pEList;.  if( !p
13ea0 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53  EList ) return S
13eb0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66  QLITE_ERROR;.  f
13ec0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
13ed0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13ee0 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45     Expr *pX = pE
13ef0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13f00 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13f10 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
13f20 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
13f30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13f40 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
13f50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13f60 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
13f70 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
13f80 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
13f90 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
13fa0 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f   .  ** expressio
13fb0 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
13fc0 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
13fd0 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
13fe0 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
13ff0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69  .  assert( !p->i
14000 73 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70  sAgg );.  pGroup
14010 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
14020 3b 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  ;.  if( pGroupBy
14030 20 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29   || sNC.hasAgg )
14040 7b 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d  {.    p->isAgg =
14050 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
14060 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20   sNC.allowAgg = 
14070 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
14080 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
14090 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
140a0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
140b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
140c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
140d0 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
140e0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
140f0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14100 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
14110 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
14120 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
14130 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
14140 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
14150 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65  ..  /* Add the e
14160 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
14170 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
14180 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
14190 67 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  g the.  ** other
141a0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
141b0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
141c0 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
141d0 20 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65   that.  ** expre
141e0 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
141f0 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
14200 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
14210 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
14220 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
14230 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
14240 2a 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  **.  ** Minor po
14250 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
14260 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
14270 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
14280 6c 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76  ll be.  ** re-ev
14290 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
142a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
142b0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c  ..  */.  sNC.pEL
142c0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
142d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
142e0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
142f0 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
14300 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ||.      sqlite3
14310 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
14320 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
14330 67 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63  g) ||.      proc
14340 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28  essOrderGroupBy(
14350 26 73 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42  &sNC, p->pOrderB
14360 79 2c 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20  y, "ORDER") ||. 
14370 20 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65       processOrde
14380 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
14390 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22  GroupBy, "GROUP"
143a0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
143b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
143c0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
143d0 75 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  ure the GROUP BY
143e0 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
143f0 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61   contain aggrega
14400 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  te functions..  
14410 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42  */.  if( pGroupB
14420 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
14430 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
14440 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72  Item;.  .    for
14450 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
14460 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
14470 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
14480 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
14490 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
144a0 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
144b0 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
144c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
144d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
144e0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
144f0 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
14500 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
14510 20 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42      "the GROUP B
14520 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
14530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14540 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
14550 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
14560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14570 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
14580 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
14590 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
145a0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
145b0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
145c0 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
145d0 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
145e0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
145f0 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
14600 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
14610 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
14620 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f  utine simply sto
14630 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
14640 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
14650 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
14660 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
14670 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
14680 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
14690 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
146a0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
146b0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
146c0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
146d0 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
146e0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
146f0 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  nc+pAggInfo->nCo
14700 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lumn==0 ){.    r
14710 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
14720 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
14730 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
14740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14750 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e  AddOp(v, OP_MemN
14760 75 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ull, pAggInfo->a
14770 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b  Col[i].iMem, 0);
14780 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
14790 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
147a0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
147b0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
147c0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
147d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
147e0 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75   OP_MemNull, pFu
147f0 6e 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20  nc->iMem, 0);.  
14800 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
14810 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
14820 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
14830 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
14840 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d    if( pE->pList=
14850 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d  =0 || pE->pList-
14860 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
14870 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14880 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
14890 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67  STINCT in aggreg
148a0 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ate must be foll
148b0 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20  owed ".         
148c0 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73    "by an express
148d0 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ion");.        p
148e0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
148f0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
14900 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
14910 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
14920 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
14930 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
14940 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
14950 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
14960 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
14970 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
14980 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  t, 0, .         
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
149b0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
149c0 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
149d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
149e0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
149f0 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
14a00 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
14a10 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
14a20 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
14a30 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
14a40 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
14a50 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
14a60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14a70 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
14a80 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
14a90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14aa0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
14ab0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
14ac0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
14ad0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
14ae0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
14af0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
14b00 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
14b10 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
14b20 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ->pList;.    sql
14b30 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
14b40 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e  P_AggFinal, pF->
14b50 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c  iMem, pList ? pL
14b60 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 0a  ist->nExpr : 0,.
14b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b80 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
14b90 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44  >pFunc, P3_FUNCD
14ba0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
14bb0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
14bc0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
14bd0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
14be0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
14bf0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
14c00 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
14c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
14c20 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
14c30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14c40 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
14c50 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
14c60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14c70 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
14c80 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
14c90 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
14ca0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
14cb0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
14cc0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
14cd0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
14ce0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
14cf0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
14d00 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
14d10 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
14d20 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
14d30 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
14d40 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  = pF->pExpr->pLi
14d50 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  st;.    if( pLis
14d60 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
14d70 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
14d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14d90 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
14da0 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20  arse, pList);.  
14db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
14dc0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Arg = 0;.    }. 
14dd0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
14de0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
14df0 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
14e00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14e10 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
14e20 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
14e30 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
14e40 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  (v, pF->iDistinc
14e50 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
14e60 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
14e70 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65  ( pF->pFunc->nee
14e80 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  dCollSeq ){.    
14e90 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
14ea0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
14eb0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
14ec0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
14ed0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
14ee0 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
14ef0 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
14f00 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  <pList->nExpr; j
14f10 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
14f20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
14f30 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
14f40 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
14f50 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
14f60 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
14f80 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
14f90 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
14fa0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14fb0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  VdbeOp3(v, OP_Co
14fc0 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68  llSeq, 0, 0, (ch
14fd0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43  ar *)pColl, P3_C
14fe0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
14ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
15000 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  3(v, OP_AggStep,
15010 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c   pF->iMem, nArg,
15020 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
15030 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
15040 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
15050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15060 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15070 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
15080 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
15090 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
150a0 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
150b0 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
150c0 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
150d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
150e0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
150f0 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
15100 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
15110 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e 69  _MemStore, pC->i
15120 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 70  Mem, 1);.  }.  p
15130 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
15140 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  ode = 0;.}.../*.
15150 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15160 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
15170 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
15180 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
15190 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
151a0 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
151b0 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
151c0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
151d0 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d 2e  eDest and iParm.
151e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73 74  .**.**     eDest
151f0 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65 73   Value       Res
15200 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
15210 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15240 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
15250 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e  T_Callback    In
15260 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61 63  voke the callbac
15270 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  k for each row o
15280 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  f the result..**
15290 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
152a0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66 69          Store fi
152b0 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d 65  rst result in me
152c0 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d 0a  mory cell iParm.
152d0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
152e0 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  t         Store 
152f0 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73 20  results as keys 
15300 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  of table iParm..
15310 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e  **.**     SRT_Un
15320 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20  ion       Store 
15330 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79  results as a key
15340 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
15350 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a  table iParm.**.*
15360 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
15370 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
15380 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
15390 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
153a0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
153b0 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
153c0 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
153d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
153e0 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iParm.**.** The 
153f0 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20 69  table above is i
15400 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64 69  ncomplete.  Addi
15410 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61 6c  tional eDist val
15420 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65 64  ue have be added
15430 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20 63  .** since this c
15440 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74 74  omment was writt
15450 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65 6c  en.  See the sel
15460 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 66  ectInnerLoop() f
15470 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61  unction for.** a
15480 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69 6e   complete listin
15490 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65 64  g of the allowed
154a0 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73 74   values of eDest
154b0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e 69   and their meani
154c0 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ngs..**.** This 
154d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
154e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
154f0 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
15500 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
15510 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
15520 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
15530 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
15540 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
15550 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
15560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
15570 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
15580 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
15590 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
155a0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
155b0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
155c0 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  that..**.** The 
155d0 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 54  pParent, parentT
155e0 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e 74  ab, and *pParent
155f0 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20 66  Agg fields are f
15600 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69 73  illed in if this
15610 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61 20  .** SELECT is a 
15620 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
15630 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79 20  routine may try 
15640 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73 20  to combine this 
15650 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 69  SELECT.** with i
15660 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f 72  ts parent to for
15670 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  m a single flat 
15680 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64 6f  query.  In so do
15690 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a 2a  ing, it might.**
156a0 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72 65   change the pare
156b0 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61 20  nt query from a 
156c0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74 6f  non-aggregate to
156d0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
156e0 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61 74  ery..** For that
156f0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50 61   reason, the pPa
15700 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73 20  rentAgg flag is 
15710 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69 6e  passed as a poin
15720 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63 61  ter, so it.** ca
15730 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  n be changed..**
15740 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
15750 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
15760 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61  the pParent para
15770 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  meter..**.**    
15780 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
15790 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78 2c   JOIN (SELECT x,
157a0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
157b0 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20  2) JOIN t3;.**  
157c0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
157d0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
157e0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
157f0 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20  __/        /.** 
15800 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 20             /.** 
15840 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
15850 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
15860 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
15870 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a  __________/.**.*
15880 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15890 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
158a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69 72   outer query fir
158b0 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20 63  st.   For that c
158c0 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74 20  all,.** pParent 
158d0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20 44  will be NULL.  D
158e0 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65 73  uring the proces
158f0 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74 65  sing of the oute
15900 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a 2a  r query, this .*
15910 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
15920 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 20  led recursively 
15930 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73 75  to handle the su
15940 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68 65  bquery.  For the
15950 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63 61   recursive.** ca
15960 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  ll, pParent will
15970 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f 75   point to the ou
15980 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63 61  ter query.  Beca
15990 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72 79  use the subquery
159a0 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   is.** the secon
159b0 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20 74  d element in a t
159c0 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20 74  hree-way join, t
159d0 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61 72  he parentTab par
159e0 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20 62  ameter will.** b
159f0 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61 6c  e 1 (the 2nd val
15a00 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78 65  ue of a 0-indexe
15a10 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74  d array.).*/.int
15a20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
15a30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15a40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15a50 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
15a60 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15a80 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15a90 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
15aa0 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20  */.  int eDest, 
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
15ac0 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
15ad0 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
15ae0 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
15af0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 61           /* A pa
15b00 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79 20  rameter used by 
15b10 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f 73  the eDest dispos
15b20 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 53  al method */.  S
15b30 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c 20  elect *pParent, 
15b40 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
15b50 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69 63   SELECT for whic
15b60 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62 2d  h this is a sub-
15b70 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70  query */.  int p
15b80 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20 20  arentTab,       
15b90 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 50    /* Index in pP
15ba0 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20 74  arent->pSrc of t
15bb0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
15bc0 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20  nt *pParentAgg, 
15bd0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15be0 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61 67   pParent uses ag
15bf0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
15c00 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  s */.  char *aff
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c20 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
15c30 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
15c40 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
15c50 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
15c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15c70 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
15c80 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
15c90 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
15ca0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
15cb0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
15cc0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
15cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
15ce0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
15cf0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
15d00 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
15d30 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
15d40 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
15d50 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
15d60 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
15d70 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
15d80 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
15d90 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
15da0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
15db0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
15dc0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
15dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15de0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
15df0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
15e00 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
15e10 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
15e20 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
15e30 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
15e40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
15e50 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
15e60 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
15e70 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
15e80 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
15e90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
15ea0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
15eb0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
15ec0 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
15ed0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
15ee0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
15ef0 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
15f00 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
15f10 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
15f20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
15f30 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
15f40 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
15f50 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
15f60 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
15f70 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
15f80 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
15f90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
15fa0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
15fb0 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75   an OP_OpenVirtu
15fc0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
15fd0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
15fe0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
15ff0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
16000 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
16010 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
16020 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16030 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
16040 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
16050 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 71 6c  ry */..  if( sql
16060 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
16070 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
16080 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20  e->nErr || p==0 
16090 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
160a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
160b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
160c0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
160d0 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
160e0 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
160f0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
16100 67 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  gInfo));..#ifnde
16110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
16120 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
16130 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
16140 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
16150 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
16160 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
16170 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
16180 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
16190 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
161a0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
161b0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20  elect *pLoop;.  
161c0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
161d0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
161e0 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
161f0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
16200 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
16210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
16220 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
16230 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
16240 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b  st, iParm, aff);
16250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
16260 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
16270 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e  derBy;.  if( Ign
16280 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44  orableOrderby(eD
16290 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70  est) ){.    p->p
162a0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
162b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
162c0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
162d0 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
162e0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
162f0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65  ;.  }.  p->pOrde
16300 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
16310 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
16320 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
16330 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
16340 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
16350 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
16360 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
16370 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
16380 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
16390 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
163a0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
163b0 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
163c0 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
163d0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
163e0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
163f0 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
16400 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
16410 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20  ct_end;..  /* . 
16420 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
16430 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
16440 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
16450 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
16460 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
16470 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
16480 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
16490 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
164a0 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
164b0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
164c0 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
164d0 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
164e0 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
164f0 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
16500 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
16510 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
16520 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16530 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74  ERY.  if( (eDest
16540 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
16550 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
16560 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
16570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16580 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16590 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
165a0 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
165b0 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
165c0 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
165d0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
165e0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
165f0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
16600 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
16610 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
16620 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
16630 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
16640 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
16650 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
16660 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
16670 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
16680 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
16690 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
166a0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
166b0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
166c0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
166d0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
166e0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
166f0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
16700 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
16710 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
16720 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
16730 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
16740 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
16750 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
16760 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
16770 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
16780 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
16790 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
167a0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
167b0 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
167c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
167d0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
167e0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
167f0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
16800 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16810 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
16820 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16830 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
16840 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
16850 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
16860 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
16870 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
16880 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
16890 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
168a0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
168b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
168c0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
168d0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  ];..    if( pIte
168e0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
168f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
16900 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
16910 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
16920 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
16930 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
16940 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
16950 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
16960 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
16970 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
16980 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
16990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
169a0 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
169b0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
169c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
169d0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
169e0 65 6c 65 63 74 2c 20 53 52 54 5f 56 69 72 74 75  elect, SRT_Virtu
169f0 61 6c 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20  alTab, .        
16a00 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
16a10 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
16a20 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
16a30 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
16a40 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
16a50 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
16a60 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
16a70 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
16a80 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
16a90 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
16aa0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
16ab0 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
16ac0 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
16ad0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
16ae0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
16af0 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
16b00 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
16b10 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
16b20 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
16b30 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
16b40 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
16b50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
16b60 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
16b70 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
16b80 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
16b90 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
16ba0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
16bb0 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
16bc0 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
16bd0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
16be0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
16bf0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
16c00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
16c10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
16c20 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
16c30 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
16c40 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
16c50 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
16c60 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
16c70 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
16c80 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
16c90 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
16ca0 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
16cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16cc0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
16cd0 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
16ce0 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
16cf0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
16d00 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
16d10 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
16d20 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
16d30 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
16d40 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
16d50 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
16d60 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
16d70 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
16d80 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
16d90 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
16da0 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
16db0 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
16dc0 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
16dd0 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
16de0 65 63 69 66 69 65 64 20 61 6e 64 20 63 72 65 61  ecified and crea
16df0 74 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  te a sorting ind
16e00 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ex..  **.  ** Th
16e10 69 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  is sorting index
16e20 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
16e30 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
16e40 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
16e50 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
16e60 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
16e70 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
16e80 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
16e90 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69  e.  ** OP_OpenVi
16ea0 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
16eb0 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
16ec0 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
16ed0 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
16ee0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
16ef0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
16f00 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
16f10 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
16f20 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
16f30 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
16f40 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
16f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
16f60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72  derBy ){.    str
16f70 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16f80 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65  m *pTerm;.    Ke
16f90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16fa0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  .    for(i=0, pT
16fb0 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  erm=pOrderBy->a;
16fc0 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
16fd0 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  pr; i++, pTerm++
16fe0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
16ff0 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  rm->zName ){.   
17000 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70       pTerm->pExp
17010 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
17020 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
17030 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a  pParse, pTerm->z
17040 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Name, -1);.     
17050 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17060 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
17070 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
17080 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
17090 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
170a0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
170b0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
170c0 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
170d0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
170e0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
170f0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
17100 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
17110 64 65 78 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  dex =.       sql
17120 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
17130 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
17140 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
17150 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
17160 70 72 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20  pr+2, .         
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17180 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
17190 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
171a0 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
171b0 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
171c0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
171d0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
171e0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
171f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17200 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74  bel(v);.  comput
17210 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
17220 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
17230 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  ;..  /* If the o
17240 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
17250 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
17260 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
17270 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
17280 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
17290 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20 20  VirtualTab ){.  
172a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
172b0 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72  Op(v, OP_OpenVir
172c0 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 70 45 4c  tual, iParm, pEL
172d0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
172e0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
172f0 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
17300 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
17310 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
17320 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
17330 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
17340 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73  KeyInfo;.    dis
17350 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
17360 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79  nTab++;.    pKey
17370 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
17380 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
17390 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  e, p->pEList);. 
173a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
173b0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  3(v, OP_OpenVirt
173c0 75 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ual, distinct, 0
173d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
173e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
173f0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
17400 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
17410 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
17420 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
17430 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
17440 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
17450 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
17460 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
17470 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
17480 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
17490 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
174a0 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e   case is for non
174b0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
174c0 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  es.    ** Begin 
174d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
174e0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49  n.    */.    pWI
174f0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
17500 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
17510 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
17520 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  , &pOrderBy);.  
17530 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
17540 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
17550 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
17560 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
17570 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
17580 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 56  a prior OP_OpenV
17590 69 72 74 75 61 6c 20 0a 20 20 20 20 2a 2a 20 69  irtual .    ** i
175a0 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
175b0 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
175c0 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
175d0 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72  e the OP_OpenVir
175e0 74 75 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  tual.    ** into
175f0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
17600 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72   */.    if( addr
17610 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
17620 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
17630 20 20 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72       uncreateSor
17640 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
17650 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  , addrSortIndex)
17660 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
17670 70 65 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b  penVirt[2] = -1;
17680 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
17690 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
176a0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
176b0 2f 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  /.    if( select
176c0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
176d0 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
176e0 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
176f0 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d    iParm, pWInfo-
17720 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
17730 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29  fo->iBreak, aff)
17740 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20   ){.       goto 
17750 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
17760 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  }..    /* End th
17770 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
17780 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
17790 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
177a0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
177b0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  e{.    /* This i
177c0 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  s the processing
177d0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71   for aggregate q
177e0 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61  ueries */.    Na
177f0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
17800 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
17810 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
17820 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
17830 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
17840 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
17850 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
17860 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
17870 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
17880 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
17890 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
178a0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
178b0 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
178c0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
178d0 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
178e0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
178f0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
17900 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
17910 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
17940 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
17950 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
17960 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
17980 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
17990 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
179a0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
179b0 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
179c0 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
179d0 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
179e0 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
179f0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
17a00 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
17a10 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
17a20 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  /...    /* The f
17a30 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
17a40 65 73 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65  es hold addresse
17a50 73 20 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20  s or labels for 
17a60 70 61 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20  parts of the.   
17a70 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
17a80 69 6e 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61  ine program we a
17a90 72 65 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74  re putting toget
17aa0 68 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  her */.    int a
17ab0 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  ddrOutputRow;   
17ac0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73     /* Start of s
17ad0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
17ae0 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
17af0 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  row */.    int a
17b00 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20  ddrSetAbort;    
17b10 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
17b20 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
17b30 75 72 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  urn */.    int a
17b40 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
17b50 70 3b 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63  p; /* Start of c
17b60 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c  ode that initial
17b70 69 7a 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c  izes the input l
17b80 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  oop */.    int a
17b90 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20  ddrTopOfLoop;   
17ba0 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
17bb0 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
17bc0 20 20 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70     int addrGroup
17bd0 42 79 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f  ByChange;  /* Co
17be0 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
17bf0 6e 20 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74  n any GROUP BY t
17c00 65 72 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  erm changes */. 
17c10 20 20 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65     int addrProce
17c20 73 73 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f  ssRow;     /* Co
17c30 64 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  de to process a 
17c40 73 69 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77  single input row
17c50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
17c60 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
17c70 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72  /* End of all pr
17c80 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20  ocessing */.    
17c90 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
17ca0 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  dx;     /* The O
17cb0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 66 6f  P_OpenVirtual fo
17cc0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
17cd0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  dex */.    int a
17ce0 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 20  ddrReset;       
17cf0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
17d00 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
17d10 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
17d20 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  /..    addrEnd =
17d30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17d40 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
17d50 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
17d60 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
17d70 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
17d80 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
17d90 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
17da0 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
17db0 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
17dc0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
17dd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
17de0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
17df0 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
17e00 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
17e10 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
17e20 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
17e30 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
17e40 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
17e50 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
17e60 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
17e70 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
17e80 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
17e90 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
17ea0 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
17eb0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
17ec0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
17ed0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17ee0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
17ef0 73 4e 43 2c 20 70 45 4c 69 73 74 29 20 29 7b 0a  sNC, pEList) ){.
17f00 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
17f10 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
17f20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
17f30 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
17f40 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 20 29  sNC, pOrderBy) )
17f50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
17f60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
17f70 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26     if( pHaving &
17f80 26 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  & sqlite3ExprAna
17f90 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
17fa0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b  sNC, pHaving) ){
17fb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
17fc0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
17fd0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
17fe0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
17ff0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
18000 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
18010 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
18020 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
18030 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
18040 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
18050 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
18060 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b 0a 20 20  pr->pList) ){.  
18070 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
18080 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
18090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
180a0 69 74 65 33 54 73 64 28 29 2d 3e 6d 61 6c 6c 6f  ite3Tsd()->mallo
180b0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
180c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
180d0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
180e0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
180f0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
18100 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
18110 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
18120 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 20 61 67  e complex tha ag
18130 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
18140 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
18150 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
18160 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
18170 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
18180 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
18190 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
181a0 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
181b0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65  */..      /* Cre
181c0 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20  ate labels that 
181d0 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69  we will be needi
181e0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
181f0 20 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74   .      addrInit
18200 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c  ializeLoop = sql
18210 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18220 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  l(v);.      addr
18230 47 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20  GroupByChange = 
18240 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18250 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
18260 64 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20  ddrProcessRow = 
18270 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18280 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20  abel(v);..      
18290 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
182a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
182b0 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
182c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
182d0 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
182e0 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
182f0 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
18300 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
18310 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
18320 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
18330 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
18340 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56  r all, the OpenV
18350 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69  irtual instructi
18360 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
18370 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
18380 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
18390 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
183a0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
183b0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
183c0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
183d0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
183e0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
183f0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
18400 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
18410 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18420 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
18430 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 73 41 67  OpenVirtual, sAg
18440 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
18450 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18460 20 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49             sAggI
18470 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
18480 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
184a0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
184b0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
184c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
184d0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
184e0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
184f0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
18500 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
18510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
18520 73 65 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d  seFlag = pParse-
18530 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
18540 41 62 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72  AbortFlag = pPar
18550 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
18560 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
18570 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
18580 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
18590 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
185a0 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
185b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
185c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
185d0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
185e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
185f0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
18600 65 6d 49 6e 74 2c 20 30 2c 20 69 41 62 6f 72 74  emInt, 0, iAbort
18610 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
18620 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
18630 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
18640 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
18650 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18660 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 55 73  P_MemInt, 0, iUs
18670 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
18680 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
18690 20 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75   indicate accumu
186a0 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
186b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
186c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
186d0 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69 61  o, 0, addrInitia
186e0 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20 20  lizeLoop);..    
186f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
18700 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
18710 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65  outputs a single
18720 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
18730 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  lt.      ** set.
18740 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e    This subroutin
18750 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74  e first looks at
18760 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20   the iUseFlag.  
18770 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20  If iUseFlag.    
18780 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61    ** is less tha
18790 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
187a0 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ro, the subrouti
187b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
187c0 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  If.      ** the 
187d0 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73  processing calls
187e0 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74   for the query t
187f0 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75  o abort, this su
18800 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
18810 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  * increments the
18820 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f   iAbortFlag memo
18830 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ry location befo
18840 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a  re returning in.
18850 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
18860 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c  o signal the cal
18870 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20  ler to abort..  
18880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
18890 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69  rSetAbort = sqli
188a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
188b0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
188c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
188d0 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 69   OP_MemInt, 1, i
188e0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
188f0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
18900 2c 20 22 23 20 73 65 74 20 61 62 6f 72 74 20 66  , "# set abort f
18910 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
18920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
18930 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20  , OP_Return, 0, 
18940 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  0);.      addrOu
18950 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
18960 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18970 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
18980 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18990 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73 65  P_IfMemPos, iUse
189a0 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
189b0 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
189c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
189d0 20 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   Groupby result 
189e0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
189f0 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
18a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18a10 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30  (v, OP_Return, 0
18a20 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  , 0);.      fina
18a30 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
18a40 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
18a50 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  fo);.      if( p
18a60 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
18a70 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
18a80 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
18a90 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
18aa0 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20  Row+1, 1);.     
18ab0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65   }.      rc = se
18ac0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
18ad0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
18ae0 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
18af0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18b10 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 20  istinct, eDest, 
18b20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20  iParm, .        
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
18b50 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
18b60 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69 66  , aff);.      if
18b70 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
18b80 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
18b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
18ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18bb0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
18bc0 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   0);.      VdbeC
18bd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 6e  omment((v, "# en
18be0 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
18bf0 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
18c00 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18c10 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
18c20 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
18c30 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
18c40 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
18c50 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
18c60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
18c70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
18c80 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
18c90 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
18ca0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
18cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18cc0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
18cd0 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42   0);..      /* B
18ce0 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
18cf0 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
18d00 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
18d10 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
18d20 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
18d30 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
18d40 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
18d50 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
18d60 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
18d70 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
18d80 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
18d90 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
18da0 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
18db0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
18dc0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
18dd0 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
18de0 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
18df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18e00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18e10 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c   addrInitializeL
18e20 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oop);.      sqli
18e30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18e40 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
18e50 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
18e60 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
18e70 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
18e80 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
18e90 72 65 2c 20 26 70 47 72 6f 75 70 42 79 29 3b 0a  re, &pGroupBy);.
18ea0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
18eb0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
18ec0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
18ed0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
18ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
18ef0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
18f00 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
18f10 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
18f20 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
18f30 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
18f40 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
18f50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 74 61 62  _OpenVirtual tab
18f60 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
18f70 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
18f80 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
18f90 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
18fa0 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
18fb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18fc0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
18fd0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
18fe0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
18ff0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
19000 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
19010 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
19020 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
19030 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
19040 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
19050 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
19060 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
19070 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
19080 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
19090 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
190a0 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
190b0 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
190c0 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
190d0 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
190e0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
190f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
19100 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
19110 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19120 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
19130 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
19140 42 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  By);.        sql
19150 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19160 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
19170 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
19180 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a  x, 0);.        j
19190 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
191a0 70 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  pr+1;.        fo
191b0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
191c0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
191d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
191e0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
191f0 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
19200 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
19210 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
19220 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20 63  rterColumn<j ) c
19230 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
19240 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 43 6f     if( pCol->iCo
19250 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
19260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19270 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
19280 69 64 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  id, pCol->iTable
19290 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
192a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
192b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192c0 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
192d0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
192e0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  pCol->iColumn);.
192f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19300 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
19310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
19320 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19330 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
19340 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  j, 0);.        s
19350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19360 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
19370 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
19380 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  gIdx, 0);.      
19390 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
193a0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
193b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
193c0 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  dOp(v, OP_Sort, 
193d0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
193e0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
193f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
19400 6e 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50 20  nt((v, "# GROUP 
19410 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20  BY sort"));.    
19420 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
19430 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
19440 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
19450 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
19460 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
19470 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
19480 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
19490 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
194a0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
194b0 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
194c0 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
194d0 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
194e0 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
194f0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
19500 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
19510 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
19520 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
19530 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
19540 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
19550 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
19560 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
19570 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
19580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
19590 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
195a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
195b0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
195c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
195d0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
195e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
195f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19600 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e  P_Column, sAggIn
19610 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a  fo.sortingIdx, j
19620 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
19630 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
19640 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
19650 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
19660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
19670 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
19680 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[j].pExpr);.  
19690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
196a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
196b0 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
196c0 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f   iBMem+j, j<pGro
196d0 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
196e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
196f0 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(j=pGroupBy->nE
19700 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  xpr-1; j>=0; j--
19710 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  ){.        if( j
19720 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
19730 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
19740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19750 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
19760 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20  iBMem+j, 0);.   
19770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
19780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19790 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69  v, OP_MemLoad, i
197a0 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20  AMem+j, 0);.    
197b0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a      if( j==0 ){.
197c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
197d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
197e0 5f 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72  _Eq, 0x200, addr
197f0 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20  ProcessRow);.   
19800 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19810 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19820 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c  eAddOp(v, OP_Ne,
19830 20 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75   0x200, addrGrou
19840 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  pByChange);.    
19850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
19860 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19870 33 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29  3(v, -1, (void*)
19880 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
19890 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  j], P3_COLLSEQ);
198a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
198b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
198c0 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
198d0 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
198e0 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
198f0 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65  ** Change in the
19900 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
19910 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
19920 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
19930 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
19940 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
19950 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
19960 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
19970 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19980 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
19990 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
199a0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
199b0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
199c0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
199d0 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
199e0 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
199f0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
19a00 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
19a10 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
19a20 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
19a30 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
19a40 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
19a50 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
19a60 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
19a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19a80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
19a90 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
19aa0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
19ab0 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
19ac0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
19ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ae0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76  dOp(v, OP_MemMov
19af0 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65  e, iAMem+j, iBMe
19b00 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  m+j);.      }.  
19b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b20 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62  ddOp(v, OP_Gosub
19b30 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52  , 0, addrOutputR
19b40 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
19b50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75  omment((v, "# ou
19b60 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
19b70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19b80 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
19b90 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  MemPos, iAbortFl
19ba0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
19bb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19bc0 28 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62 6f  (v, "# check abo
19bd0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
19be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19bf0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
19c00 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  0, addrReset);. 
19c10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
19c20 28 28 76 2c 20 22 23 20 72 65 73 65 74 20 61 63  ((v, "# reset ac
19c30 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
19c40 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
19c50 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
19c60 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
19c70 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
19c80 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
19c90 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
19ca0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
19cb0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19cc0 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73  l(v, addrProcess
19cd0 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61  Row);.      upda
19ce0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
19cf0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
19d00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19d10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
19d20 65 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c  emInt, 1, iUseFl
19d30 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
19d40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e  omment((v, "# in
19d50 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
19d60 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
19d70 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
19d80 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
19d90 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
19da0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
19db0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19dc0 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  dOp(v, OP_Next, 
19dd0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
19de0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
19df0 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  op);.      }else
19e00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19e10 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
19e20 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 63 72 65  );.        uncre
19e30 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
19e40 70 50 61 72 73 65 2c 20 61 64 64 72 53 6f 72 74  pParse, addrSort
19e50 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
19e60 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
19e70 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
19e80 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
19e90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
19ea0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19eb0 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75  Gosub, 0, addrOu
19ec0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
19ed0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19ee0 22 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  "# output final 
19ef0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20  row"));.      . 
19f00 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
19f10 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c  roupBy */.    el
19f20 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  se {.      /* Th
19f30 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
19f40 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
19f50 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
19f60 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
19f70 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
19f80 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
19f90 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
19fa0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
19fb0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
19fc0 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
19fd0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
19fe0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
19ff0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57  gInfo);.      pW
1a000 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1a010 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1a020 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1a030 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1a040 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1a050 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a060 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
1a070 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1a080 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1a090 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1a0a0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66  pWInfo);.      f
1a0b0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1a0c0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
1a0d0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f  gInfo);.      pO
1a0e0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1a0f0 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1a100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a110 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a120 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1a130 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  rEnd, 1);.      
1a140 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
1a150 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1a160 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
1a170 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20   0, 0, -1, .    
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 20 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20    eDest, iParm, 
1a1a0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
1a1b0 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20  , aff);.    }.  
1a1c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a1d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1a1e0 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
1a1f0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
1a200 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
1a210 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1a220 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a230 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
1a240 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
1a250 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
1a260 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
1a270 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
1a280 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1a290 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
1a2a0 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
1a2b0 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
1a2c0 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
1a2d0 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23  , iParm);.  }..#
1a2e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a2f0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a  IT_SUBQUERY.  /*
1a300 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73   If this was a s
1a310 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65  ubquery, we have
1a320 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74   now converted t
1a330 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1a340 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
1a350 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65 6c  y table.  So del
1a360 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ete the subquery
1a370 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
1a380 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
1a390 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73 20  to prevent this 
1a3a0 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65  subquery from be
1a3b0 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67  ing evaluated ag
1a3c0 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65  ain and to force
1a3d0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75 73   the.  ** the us
1a3e0 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  e of the tempora
1a3f0 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ry table..  */. 
1a400 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
1a410 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1a420 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ent->pSrc->nSrc>
1a430 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20  parentTab );.   
1a440 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1a450 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
1a460 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20  Tab].pSelect==p 
1a470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1a480 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a 20  lectDelete(p);. 
1a490 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
1a4a0 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70  ->a[parentTab].p
1a4b0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  Select = 0;.  }.
1a4c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d  #endif..  /* Jum
1a4d0 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
1a4e0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
1a4f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a500 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
1a510 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
1a520 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
1a530 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
1a540 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
1a550 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
1a560 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
1a570 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
1a580 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
1a590 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
1a5a0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
1a5b0 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
1a5c0 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
1a5d0 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
1a5e0 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
1a5f0 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
1a600 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67   sqliteFree(sAgg
1a610 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
1a620 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66  liteFree(sAggInf
1a630 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
1a640 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.