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

Artifact 459fb935f1b3f6f0011c548a7664b4d7d062a041:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 32 37 31  select.c,v 1.271
0200: 20 32 30 30 35 2f 30 39 2f 31 39 20 31 37 3a 33   2005/09/19 17:3
0210: 35 3a 35 33 20 64 72 68 20 45 78 70 20 24 0a 2a  5:53 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0820: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
0830: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0840: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20  addrOpenVirt[1] 
0850: 3d 20 2d 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  = -1;.    pNew->
0860: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 20  addrOpenVirt[2] 
0870: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0880: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0890: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
08a0: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
08b0: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
08c0: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
08d0: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
08e0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
08f0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0900: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0910: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0920: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0930: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0940: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0950: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0960: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0970: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0980: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0990: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
09a0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
09b0: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
09c0: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
09d0: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
09e0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
09f0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0a00: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0a10: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0a20: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0a30: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0a40: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0a50: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0a60: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a80: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a90: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0aa0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0ab0: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0ac0: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0ad0: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0ae0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0af0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0b00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b10: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0b20: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0b30: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0b40: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0b50: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0b60: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b70: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b80: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b90: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0ba0: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0bb0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0bc0: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0bd0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0be0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0bf0: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0c00: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0c10: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0c20: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0c30: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0c40: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0c50: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0c60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
0c70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
0c80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
0c90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
0ca0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
0cb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
0cc0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
0cd0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
0ce0: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
0cf0: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
0d00: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
0d10: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
0d20: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
0d30: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
0d40: 74 65 33 53 74 72 4e 49 43 6d 70 28 70 2d 3e 7a  te3StrNICmp(p->z
0d50: 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b  , keywords[j].zK
0d60: 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30  eyword, p->n)==0
0d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
0d80: 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73  type |= keywords
0d90: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
0da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
0db0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
0dc0: 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  >=sizeof(keyword
0dd0: 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72  s)/sizeof(keywor
0de0: 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ds[0]) ){.      
0df0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
0e00: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
0e10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
0e20: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
0e30: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
0e40: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
0e50: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
0e60: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
0e70: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
0e80: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
0e90: 61 72 20 2a 7a 53 70 31 20 3d 20 22 20 22 3b 0a  ar *zSp1 = " ";.
0ea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0eb0: 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20 20 20 20  zSp2 = " ";.    
0ec0: 69 66 28 20 70 42 3d 3d 30 20 29 7b 20 7a 53 70  if( pB==0 ){ zSp
0ed0: 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70  1++; }.    if( p
0ee0: 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b 2b 3b 20  C==0 ){ zSp2++; 
0ef0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
0f00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
0f10: 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70  nknown or unsupp
0f20: 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a  orted join type:
0f30: 20 22 0a 20 20 20 20 20 20 20 22 25 54 25 73 25   ".       "%T%s%
0f40: 54 25 73 25 54 22 2c 20 70 41 2c 20 7a 53 70 31  T%s%T", pA, zSp1
0f50: 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70 43 29 3b  , pB, zSp2, pC);
0f60: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
0f70: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
0f80: 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65 20 26  e if( jointype &
0f90: 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20 20 20   JT_RIGHT ){.   
0fa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0fb0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0fc0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
0fd0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
0fe0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
0ff0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1000: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1010: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1020: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
1030: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1040: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
1050: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
1060: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
1070: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
1080: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1090: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
10a0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
10b0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
10c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
10d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
10e0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
10f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1100: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1110: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1120: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1130: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1140: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1150: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
1160: 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20 74 6f  ue of a token to
1170: 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d 69 6e   a '\000'-termin
1180: 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  ated string..*/.
1190: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
11a0: 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c 20 63  oken(Token *p, c
11b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
11c0: 20 70 2d 3e 7a 20 3d 20 7a 3b 0a 20 20 70 2d 3e   p->z = z;.  p->
11d0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
11e0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
11f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20  /*.** Create an 
1200: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1210: 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  for an identifie
1220: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
1230: 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74  of zName.*/.stat
1240: 69 63 20 45 78 70 72 20 2a 63 72 65 61 74 65 49  ic Expr *createI
1250: 64 45 78 70 72 28 63 6f 6e 73 74 20 63 68 61 72  dExpr(const char
1260: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
1270: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
1280: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
1290: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
12a0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
12b0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d  0, 0, &dummy);.}
12c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  .../*.** Add a t
12d0: 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45  erm to the WHERE
12e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a   expression in *
12f0: 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75  ppExpr that requ
1300: 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c  ires the.** zCol
1310: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71   column to be eq
1320: 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74  ual in the two t
1330: 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20  ables pTab1 and 
1340: 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  pTab2..*/.static
1350: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1360: 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rm(.  const char
1370: 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f   *zCol,        /
1380: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1390: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
13a0: 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20  Table *pTab1,   
13b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c     /* First tabl
13c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13d0: 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20  r *zAlias1,     
13e0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72  /* Alias for fir
13f0: 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  st table.  May b
1400: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  e NULL */.  cons
1410: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20  t Table *pTab2, 
1420: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74       /* Second t
1430: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1440: 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20  char *zAlias2,  
1450: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1460: 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d  second table.  M
1470: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1480: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20 20  Expr **ppExpr   
1490: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
14a0: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
14b0: 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65 73  m to this expres
14c0: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
14d0: 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20  r *pE1a, *pE1b, 
14e0: 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70  *pE1c;.  Expr *p
14f0: 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32  E2a, *pE2b, *pE2
1500: 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a  c;.  Expr *pE;..
1510: 20 20 70 45 31 61 20 3d 20 63 72 65 61 74 65 49    pE1a = createI
1520: 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 70  dExpr(zCol);.  p
1530: 45 32 61 20 3d 20 63 72 65 61 74 65 49 64 45 78  E2a = createIdEx
1540: 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20  pr(zCol);.  if( 
1550: 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20  zAlias1==0 ){.  
1560: 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62    zAlias1 = pTab
1570: 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  1->zName;.  }.  
1580: 70 45 31 62 20 3d 20 63 72 65 61 74 65 49 64 45  pE1b = createIdE
1590: 78 70 72 28 7a 41 6c 69 61 73 31 29 3b 0a 20 20  xpr(zAlias1);.  
15a0: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
15b0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
15c0: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
15d0: 7d 0a 20 20 70 45 32 62 20 3d 20 63 72 65 61 74  }.  pE2b = creat
15e0: 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 32 29  eIdExpr(zAlias2)
15f0: 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69 74  ;.  pE1c = sqlit
1600: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
1610: 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20  E1b, pE1a, 0);. 
1620: 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 45   pE2c = sqlite3E
1630: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62  xpr(TK_DOT, pE2b
1640: 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45  , pE2a, 0);.  pE
1650: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1660: 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63  K_EQ, pE1c, pE2c
1670: 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74 50  , 0);.  ExprSetP
1680: 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46  roperty(pE, EP_F
1690: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 2a 70 70 45  romJoin);.  *ppE
16a0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
16b0: 72 41 6e 64 28 2a 70 70 45 78 70 72 2c 20 70 45  rAnd(*ppExpr, pE
16c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
16d0: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
16e0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
16f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
1700: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
1710: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
1720: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
1730: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
1740: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1750: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
1760: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
1770: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
1780: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
1790: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
17a0: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
17b0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
17c0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
17d0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
17e0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
17f0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
1800: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
1810: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
1820: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
1830: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
1840: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
1850: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
1860: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1870: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
1880: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
1890: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
18a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
18b0: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
18c0: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  p){.  while( p )
18d0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
18e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
18f0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 73 65 74 4a 6f  Join);.    setJo
1900: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29  inExpr(p->pLeft)
1910: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
1920: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
1930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1940: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
1950: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
1960: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
1970: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
1980: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
1990: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
19a0: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
19b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19c0: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
19d0: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
19e0: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
19f0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
1a00: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
1a10: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
1a20: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1a30: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
1a40: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
1a50: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
1a60: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a70: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
1a80: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
1a90: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
1aa0: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
1ab0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1ac0: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
1ad0: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
1ae0: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
1af0: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
1b00: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
1b10: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
1b20: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
1b30: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
1b40: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
1b50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b60: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
1b70: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
1b80: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
1b90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ba0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
1bb0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1bc0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
1bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1be0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
1bf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1c00: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
1c10: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
1c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1c30: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
1c40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1c50: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1c80: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1c90: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
1ca0: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
1cb0: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
1cc0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
1cd0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
1ce0: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
1cf0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
1d00: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
1d10: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
1d20: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
1d30: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
1d40: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
1d50: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
1d60: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
1d70: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
1d80: 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20  ble *pLeftTab = 
1d90: 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20  pLeft->pTab;.   
1da0: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
1db0: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
1dc0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ;..    if( pLeft
1dd0: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
1de0: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
1df0: 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  e;..    /* When 
1e00: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
1e10: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
1e20: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
1e30: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
1e40: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
1e50: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
1e60: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
1e70: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1e80: 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70  ( pLeft->jointyp
1e90: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
1ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  {.      if( pLef
1eb0: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66 74 2d  t->pOn || pLeft-
1ec0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
1ed0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ee0: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41  sg(pParse, "a NA
1ef0: 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e  TURAL join may n
1f00: 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20  ot have ".      
1f10: 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55       "an ON or U
1f20: 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29  SING clause", 0)
1f30: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1f50: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65    for(j=0; j<pLe
1f60: 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ftTab->nCol; j++
1f70: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1f80: 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61  *zName = pLeftTa
1f90: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1fa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1fb0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
1fc0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  Tab, zName)>=0 )
1fd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
1fe0: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
1ff0: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2000: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2030: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2040: 73 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  s, &p->pWhere);.
2050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2060: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2070: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2080: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2090: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
20a0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
20b0: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26 26  f( pLeft->pOn &&
20c0: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
20d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20f0: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2100: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2110: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2120: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2130: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2140: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2150: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2160: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2170: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2180: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2190: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
21a0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
21b0: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
21c0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  >pOn ){.      se
21d0: 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74 2d  tJoinExpr(pLeft-
21e0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e  >pOn);.      p->
21f0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2200: 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72  ExprAnd(p->pWher
2210: 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a  e, pLeft->pOn);.
2220: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 4f 6e        pLeft->pOn
2230: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2240: 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61   /* Create extra
2250: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48   terms on the WH
2260: 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65  ERE clause for e
2270: 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  ach column named
2280: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55  .    ** in the U
2290: 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78  SING clause.  Ex
22a0: 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77  ample: If the tw
22b0: 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  o tables to be j
22c0: 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a  oined are .    *
22d0: 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68  * A and B and th
22e0: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e  e USING clause n
22f0: 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a  ames X, Y, and Z
2300: 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a  , then add this.
2310: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48      ** to the WH
2320: 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41  ERE clause:    A
2330: 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42  .X=B.X AND A.Y=B
2340: 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20  .Y AND A.Z=B.Z. 
2350: 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20     ** Report an 
2360: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c  error if any col
2370: 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  umn mentioned in
2380: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
2390: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  e is.    ** not 
23a0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74  contained in bot
23b0: 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a  h tables to be j
23c0: 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  oined..    */.  
23d0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 55 73    if( pLeft->pUs
23e0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
23f0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 4c 65  ist *pList = pLe
2400: 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ft->pUsing;.    
2410: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
2420: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
2430: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2440: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
2450: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2460: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2470: 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29  pLeftTab, zName)
2480: 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65  <0 || columnInde
2490: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
24a0: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
24b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24c0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
24d0: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
24e0: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
24f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
2500: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2510: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61  oth tables", zNa
2520: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  me);.          r
2530: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2540: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
2550: 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70  ereTerm(zName, p
2560: 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e  LeftTab, pLeft->
2570: 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20  zAlias, .       
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
25a0: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 20  pRight->zAlias, 
25b0: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
25c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
25e0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
25f0: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
2600: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
2610: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
2620: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2630: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2640: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
2650: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
2660: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
2670: 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45 4c 69  stDelete(p->pELi
2680: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
2690: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  cListDelete(p->p
26a0: 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Src);.  sqlite3E
26b0: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 57 68  xprDelete(p->pWh
26c0: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
26d0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
26e0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71  >pGroupBy);.  sq
26f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2700: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 73  p->pHaving);.  s
2710: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2720: 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72 42 79  lete(p->pOrderBy
2730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
2740: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50 72 69  ctDelete(p->pPri
2750: 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  or);.  sqlite3Ex
2760: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d  prDelete(p->pLim
2770: 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  it);.  sqlite3Ex
2780: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f 66 66  prDelete(p->pOff
2790: 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  set);.  sqliteFr
27a0: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
27b0: 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f  Insert code into
27c0: 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70   "v" that will p
27d0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f  ush the record o
27e0: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
27f0: 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74  .** stack into t
2800: 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74  he sorter..*/.st
2810: 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e  atic void pushOn
2820: 74 6f 53 6f 72 74 65 72 28 50 61 72 73 65 20 2a  toSorter(Parse *
2830: 70 50 61 72 73 65 2c 20 56 64 62 65 20 2a 76 2c  pParse, Vdbe *v,
2840: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
2850: 72 42 79 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  rBy){.  sqlite3E
2860: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2870: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
2880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2890: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75  AddOp(v, OP_Sequ
28a0: 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ence, pOrderBy->
28b0: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
28c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28d0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72  (v, OP_Pull, pOr
28e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31  derBy->nExpr + 1
28f0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
2900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
2910: 61 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65  akeRecord, pOrde
2920: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20  rBy->nExpr + 2, 
2930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2940: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
2950: 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79  Insert, pOrderBy
2960: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a  ->iECursor, 0);.
2970: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
2980: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2990: 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49  he OFFSET and LI
29a0: 4d 49 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  MIT.*/.static vo
29b0: 69 64 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a  id codeLimiter(.
29c0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
29d0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
29e0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
29f0: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
2a00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2a10: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2a20: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
2a30: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
2a40: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
2a50: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
2a60: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rent record */. 
2a70: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
2a80: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2a90: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
2aa0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20  */.  int nPop   
2ab0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ac0: 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70   of times to pop
2ad0: 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70   stack when jump
2ae0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
2af0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 26 26  p->iOffset>=0 &&
2b00: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b   iContinue!=0 ){
2b10: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20  .    int addr = 
2b20: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2b30: 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
2b40: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20     if( nPop>0 ) 
2b50: 61 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  addr++;.    sqli
2b60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2b70: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
2b80: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
2b90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ba0: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
2bb0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
2bc0: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70  r);.    if( nPop
2bd0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
2be0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2bf0: 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29  OP_Pop, nPop, 0)
2c00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2c20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2c30: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
2c40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
2c50: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
2c60: 64 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ds"));.  }.  if(
2c70: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 26 26   p->iLimit>=0 &&
2c80: 20 69 42 72 65 61 6b 21 3d 30 20 29 7b 0a 20 20   iBreak!=0 ){.  
2c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ca0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
2cb0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
2cc0: 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  eak);.    VdbeCo
2cd0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65 78 69  mment((v, "# exi
2ce0: 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 72 65 61  t when LIMIT rea
2cf0: 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  ched"));.  }.}..
2d00: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
2d10: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
2d20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
2d30: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f  top N elements o
2d40: 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 61  f the.** stack a
2d50: 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69 54  re distinct.  iT
2d60: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
2d70: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
2d80: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
2d90: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
2da0: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
2db0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
2dc0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
2dd0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
2de0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
2df0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
2e00: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
2e10: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4b 20   made and the K 
2e20: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
2e30: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
2e40: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
2e50: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
2e60: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
2e70: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
2e80: 69 73 74 69 6e 63 74 28 0a 20 20 56 64 62 65 20  istinct(.  Vdbe 
2e90: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *v,           /*
2ea0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
2eb0: 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20  nto this VM */. 
2ec0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
2ed0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
2ee0: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
2ef0: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
2f00: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
2f10: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
2f20: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
2f30: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
2f40: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2f50: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 70 20       /* The top 
2f60: 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  N elements of th
2f70: 65 20 73 74 61 63 6b 20 6d 75 73 74 20 62 65 20  e stack must be 
2f80: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
2f90: 74 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  t K             
2fa0: 20 2f 2a 20 50 6f 70 20 4b 20 65 6c 65 6d 65 6e   /* Pop K elemen
2fb0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ts from the stac
2fc0: 6b 20 69 66 20 69 6e 64 69 73 74 69 6e 63 74 20  k if indistinct 
2fd0: 2a 2f 0a 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  */.){.#if NULL_A
2fe0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
2ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3000: 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  p(v, OP_IsNull, 
3010: 2d 4e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  -N, sqlite3VdbeC
3020: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 36 29  urrentAddr(v)+6)
3030: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
3040: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3050: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e  P_MakeRecord, -N
3060: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
3070: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
3080: 69 73 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73  istinct, iTab, s
3090: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
30a0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73  tAddr(v)+3);.  s
30b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
30c0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 4b 2c 20 30 29  v, OP_Pop, K, 0)
30d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
30e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
30f0: 20 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b   0, addrRepeat);
3100: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
3110: 76 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73  v, "# skip indis
3120: 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29  tinct records"))
3130: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3140: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
3150: 73 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a  sert, iTab, 0);.
3160: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
3170: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
3180: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
3190: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
31a0: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
31b0: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
31c0: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
31d0: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
31e0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
31f0: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
3200: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
3210: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
3220: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
3230: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
3240: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
3250: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
3260: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
3270: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
3280: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
3290: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
32a0: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
32b0: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
32c0: 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72  InnerLoop(.  Par
32d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
32e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
32f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
3300: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
3310: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
3320: 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73  omplete select s
3330: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
3340: 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  oded */.  ExprLi
3350: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
3360: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c    /* List of val
3370: 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63  ues being extrac
3380: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ted */.  int src
3390: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
33a0: 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72   /* Pull data fr
33b0: 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  om this table */
33c0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
33d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
33e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
33f0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  in the source ta
3400: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
3410: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3420: 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
3430: 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73   sort results us
3440: 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a  ing this key */.
3450: 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20    int distinct, 
3460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
3470: 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72  >=0, make sure r
3480: 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69  esults are disti
3490: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  nct */.  int eDe
34a0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
34b0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
34c0: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
34d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
34e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
34f0: 2a 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  * An argument to
3500: 20 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65   the disposal me
3510: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  thod */.  int iC
3520: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
3530: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3540: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
3550: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
3560: 74 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20  t iBreak,       
3570: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
3580: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
3590: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
35a0: 70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66  p */.  char *aff
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35c0: 2a 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  * affinity strin
35d0: 67 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52  g if eDest is SR
35e0: 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  T_Union */.){.  
35f0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
3600: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
3610: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
3620: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
3630: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
3640: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
3650: 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28  resent */..  if(
3660: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   v==0 ) return 0
3670: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
3680: 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  st!=0 );..  /* I
3690: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49  f there was a LI
36a0: 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  MIT clause on th
36b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
36c0: 6e 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  nt, then do the 
36d0: 63 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  check.  ** to se
36e0: 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68  e if this row sh
36f0: 6f 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a  ould be output..
3700: 20 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e    */.  hasDistin
3710: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
3720: 20 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45   && pEList && pE
3730: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20  List->nExpr>0;. 
3740: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
3750: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
3760: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4c 69 6d 69   ){.    codeLimi
3770: 74 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  ter(v, p, iConti
3780: 6e 75 65 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b  nue, iBreak, 0);
3790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20  .  }..  /* Pull 
37a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
37b0: 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  lumns..  */.  if
37c0: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
37d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
37e0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
37f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3800: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
3810: 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20  , srcTab, i);.  
3820: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
3830: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73   nColumn = pELis
3840: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71  t->nExpr;.    sq
3850: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
3860: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
3870: 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
3880: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
3890: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
38a0: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
38b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
38c0: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
38d0: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
38e0: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
38f0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
3900: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
3910: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
3920: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
3930: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
3940: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
3950: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c   codeDistinct(v,
3960: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
3970: 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31 29 3b 0a 20  inue, n, n+1);. 
3980: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d     if( pOrderBy=
3990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  =0 ){.      code
39a0: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
39b0: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
39c0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
39d0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
39e0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
39f0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
3a00: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
3a10: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
3a20: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
3a30: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
3a40: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
3a50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3a60: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
3a70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
3a80: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ion: {.      sql
3a90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3aa0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3ab0: 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c  nColumn, NULL_AL
3ac0: 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a  WAYS_DISTINCT);.
3ad0: 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29 7b        if( aff ){
3ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3af0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
3b00: 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54  -1, aff, P3_STAT
3b10: 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IC);.      }.   
3b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3b30: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  dOp(v, OP_IdxIns
3b40: 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ert, iParm, 0);.
3b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
3b70: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
3b80: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
3b90: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
3ba0: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
3bb0: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
3bc0: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
3bd0: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
3be0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
3bf0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
3c00: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
3c10: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
3c20: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ept: {.      int
3c30: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
3c40: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3c50: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3c60: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3c70: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
3c80: 49 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  INCT);.      sql
3c90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
3ca0: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
3cb0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
3cc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3cd0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
3ce0: 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a  iParm, addr+3);.
3cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3d00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
3d10: 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ete, iParm, 0);.
3d20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
3d40: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
3d50: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
3d60: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
3d70: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
3d80: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
3d90: 73 65 20 53 52 54 5f 56 69 72 74 75 61 6c 54 61  se SRT_VirtualTa
3da0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
3db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3dc0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
3dd0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
3de0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
3df0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
3e00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
3e10: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
3e20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3e30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3e40: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
3e50: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
3e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
3e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
3e80: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
3e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3ea0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  dOp(v, OP_Insert
3eb0: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
3ec0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3ed0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
3ee0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
3ef0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
3f00: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
3f10: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
3f20: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
3f30: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
3f40: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
3f50: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
3f60: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
3f70: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
3f80: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
3f90: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
3fa0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
3fb0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
3fc0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
3fd0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
3fe0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3ff0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
4000: 20 69 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20   int addr2;..   
4010: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4020: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4040: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
4050: 31 2c 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20  1, addr1+3);.   
4060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4070: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
4080: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
4090: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
40a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
40b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
40c0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
40d0: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
40e0: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
40f0: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
4100: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
4110: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
4120: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
4130: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
4140: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
4150: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
4160: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
4170: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
4180: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
4190: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
41a0: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
41b0: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
41c0: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
41d0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
41e0: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
41f0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
4200: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
4210: 61 72 20 61 66 66 20 3d 20 28 69 50 61 72 6d 3e  ar aff = (iParm>
4220: 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20  >16)&0xFF;.     
4230: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
4240: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
4250: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
4260: 70 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20  pr, aff);.      
4270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
4280: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4290: 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 2c 20 31  d, 1, 0, &aff, 1
42a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
42b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
42c0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50  P_IdxInsert, (iP
42d0: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
42e0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
42f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4300: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 32 2c  angeP2(v, addr2,
4310: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4320: 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
4330: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4340: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
4350: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
4360: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
4370: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4380: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
4390: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
43a0: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
43b0: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
43c0: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
43d0: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
43e0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
43f0: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
4400: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  :.    case SRT_M
4410: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
4420: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
4430: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4440: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4450: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4460: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
4470: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
4480: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4490: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
44a0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
44b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
44c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
44d0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
44e0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  reak);.      }. 
44f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4500: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
4510: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4520: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
4530: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74   /* Send the dat
4540: 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  a to the callbac
4550: 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f  k function or to
4560: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20   a subroutine.  
4570: 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  In the.    ** ca
4580: 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  se of a subrouti
4590: 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69  ne, the subrouti
45a0: 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73  ne itself is res
45b0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20  ponsible for.   
45c0: 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20   ** popping the 
45d0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74  data from the st
45e0: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
45f0: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
4600: 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ine:.    case SR
4610: 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20  T_Callback: {.  
4620: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4630: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4640: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4650: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
4660: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
4670: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4680: 65 72 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f  er(pParse, v, pO
4690: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d  rderBy);.      }
46a0: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
46b0: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
46c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
46d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
46e0: 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d  _Gosub, 0, iParm
46f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
4720: 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e  allback, nColumn
4730: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4750: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
4770: 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  ER).    /* Disca
4780: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  rd the results. 
4790: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
47a0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
47b0: 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a  nts inside.    *
47c0: 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  * the body of a 
47d0: 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75  TRIGGER.  The pu
47e0: 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65  rpose of such se
47f0: 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c  lects is to call
4800: 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66  .    ** user-def
4810: 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74  ined functions t
4820: 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66  hat have side ef
4830: 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f  fects.  We do no
4840: 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62  t care.    ** ab
4850: 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72  out the actual r
4860: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
4870: 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lect..    */.   
4880: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4890: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
48a0: 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a  =SRT_Discard );.
48b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
48c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
48d0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
48e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
48f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  }.#endif.  }.  r
4900: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4910: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
4920: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
4930: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
4940: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
4950: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
4960: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
4970: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
4980: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
4990: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
49a0: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
49b0: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
49c0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
49d0: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
49e0: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
49f0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
4a00: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
4a10: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
4a20: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
4a30: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
4a40: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
4a50: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
4a60: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
4a70: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
4a80: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
4a90: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
4aa0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
4ab0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
4ac0: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
4ad0: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
4ae0: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
4af0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
4b00: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4b10: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
4b20: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
4b30: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
4b40: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
4b50: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
4b60: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
4b70: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
4b80: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
4b90: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
4ba0: 72 65 20 74 6f 20 74 68 65 20 50 33 20 66 69 65  re to the P3 fie
4bb0: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
4bc0: 75 73 69 6e 67 0a 2a 2a 20 50 33 5f 4b 45 59 49  using.** P3_KEYI
4bd0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
4be0: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
4bf0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
4c00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
4c10: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
4c20: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
4c30: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
4c40: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
4c50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
4c60: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
4c70: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
4c80: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
4c90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
4ca0: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
4cb0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
4cc0: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
4cd0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
4ce0: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
4cf0: 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
4d00: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
4d10: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
4d20: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4d30: 65 72 20 3d 20 28 63 68 61 72 2a 29 26 70 49 6e  er = (char*)&pIn
4d40: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
4d50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
4d60: 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
4d70: 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64 62   pInfo->enc = db
4d80: 2d 3e 65 6e 63 3b 0a 20 20 20 20 66 6f 72 28 69  ->enc;.    for(i
4d90: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
4da0: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
4db0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
4dc0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
4dd0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
4de0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
4df0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
4e00: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
4e10: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
4e20: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
4e30: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
4e40: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
4e50: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
4e60: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
4e70: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
4e80: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
4e90: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
4ea0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
4eb0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
4ec0: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
4ed0: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
4ee0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
4ef0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
4f00: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
4f10: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
4f20: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
4f30: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
4f40: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
4f50: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
4f60: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
4f70: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
4f80: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
4f90: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
4fa0: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
4fb0: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
4fc0: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
4fd0: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
4fe0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
4ff0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
5000: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
5010: 74 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  t *p,       /* T
5020: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5030: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
5040: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e  ,         /* Gen
5050: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
5060: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
5070: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
5090: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
50a0: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
50b0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
50c0: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
50d0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ere */.  int iPa
50e0: 72 6d 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74  rm        /* Opt
50f0: 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  ional parameter 
5100: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5110: 65 44 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eDest */.){.  in
5120: 74 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  t brk = sqlite3V
5130: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5140: 0a 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71  .  int cont = sq
5150: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5160: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64  el(v);.  int add
5170: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
5180: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
5190: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
51a0: 79 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  y;..  iTab = pOr
51b0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
51c0: 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71  .  addr = 1 + sq
51d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
51e0: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
51f0: 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65 4c 69 6d   brk);.  codeLim
5200: 69 74 65 72 28 76 2c 20 70 2c 20 63 6f 6e 74 2c  iter(v, p, cont,
5210: 20 62 72 6b 2c 20 30 29 3b 0a 20 20 73 71 6c 69   brk, 0);.  sqli
5220: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5230: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
5240: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
5250: 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68 28   + 1);.  switch(
5260: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
5270: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5280: 20 20 63 61 73 65 20 53 52 54 5f 56 69 72 74 75    case SRT_Virtu
5290: 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  alTab: {.      s
52a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
52b0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
52c0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
52d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
52e0: 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c  p(v, OP_Pull, 1,
52f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5300: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5310: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5320: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
5330: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
5340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5350: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
5360: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
5370: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5380: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
5390: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
53a0: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73  P_NotNull, -1, s
53b0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
53c0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
53d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
53e0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
53f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5400: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5410: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
5420: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
5430: 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20  dr(v)+3);.      
5440: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
5450: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5460: 20 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53   1, 0, "n", P3_S
5470: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
5480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5490: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
54a0: 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46  (iParm&0x0000FFF
54b0: 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  F), 0);.      br
54c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
54d0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 0a  ase SRT_Exists:.
54e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
54f0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5500: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5520: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
5530: 53 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29  Store, iParm, 1)
5540: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5550: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5560: 6f 74 6f 2c 20 30 2c 20 62 72 6b 29 3b 0a 20 20  oto, 0, brk);.  
5570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5580: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
5590: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20   SRT_Callback:. 
55a0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
55b0: 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
55c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c  int i;.      sql
55d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
55e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e   OP_Integer, p->
55f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30  pEList->nExpr, 0
5600: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5610: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5620: 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20  Pull, 1, 0);.   
5630: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
5640: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
5650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5660: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
5670: 6d 6e 2c 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20  mn, -1-i, i);.  
5680: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5690: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
56a0: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
56b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
56c0: 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
56d0: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
56e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5700: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
5710: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
5720: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5730: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5740: 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  Pop, 2, 0);.    
5750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5760: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5770: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
5780: 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
5790: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
57a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
57b0: 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
57c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
57d0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
57e0: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
57f0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
5800: 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 7d  Label(v, brk);.}
5810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
5820: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
5830: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
5840: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
5850: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
5860: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
5870: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
5880: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
5890: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
58a0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ller..**.** If t
58b0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
58c0: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
58d0: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
58e0: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
58f0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69  rom.** the origi
5900: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
5910: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
5920: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
5930: 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a  a column..** .**
5940: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
5950: 20 74 79 70 65 20 66 6f 72 20 61 6e 20 65 78 70   type for an exp
5960: 72 65 73 73 69 6f 6e 20 69 73 20 65 69 74 68 65  ression is eithe
5970: 72 20 54 45 58 54 2c 20 4e 55 4d 45 52 49 43 20  r TEXT, NUMERIC 
5980: 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68 65 20 64  or ANY..** The d
5990: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
59a0: 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c  for a ROWID fiel
59b0: 64 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 2a 2f  d is INTEGER..*/
59c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
59d0: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 4e  ar *columnType(N
59e0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
59f0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
5a00: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
5a10: 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  pe;.  int j;.  i
5a20: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
5a30: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
5a40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
5a50: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
5a60: 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  ator can only oc
5a70: 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42 59 2c  cur in ORDER BY,
5a80: 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56 49 4e   GROUP BY, HAVIN
5a90: 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49 4d 49  G,.  ** and LIMI
5aa0: 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75 74 20  T clauses.  But 
5ab0: 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74 65 73  pExpr originates
5ac0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5ad0: 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53 45 4c  et of a.  ** SEL
5ae0: 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72 20 63  ECT.  So pExpr c
5af0: 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e  an never contain
5b00: 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f 72 2e   an AS operator.
5b10: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
5b20: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53  pExpr->op!=TK_AS
5b30: 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
5b40: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
5b50: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
5b60: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
5b70: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Tab = 0;.      i
5b80: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
5b90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
5ba0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
5bb0: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
5bc0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
5bd0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
5be0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
5bf0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
5c00: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
5c10: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
5c20: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
5c30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
5c40: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
5c50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
5c60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
5c70: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
5c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5c90: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
5ca0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
5cb0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
5cc0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
5cd0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20    /* FIX ME:.   
5ce0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e       ** This can
5cf0: 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68   occurs if you h
5d00: 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  ave something li
5d10: 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  ke "SELECT new.x
5d20: 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20  ;" inside.      
5d30: 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20    ** a trigger. 
5d40: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
5d50: 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63   if you referenc
5d60: 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e  e the special "n
5d70: 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ew".        ** t
5d80: 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75  able in the resu
5d90: 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65  lt set of a sele
5da0: 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68  ct.  We do not h
5db0: 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20  ave a good way. 
5dc0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e         ** to fin
5dd0: 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62  d the actual tab
5de0: 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c  le type, so call
5df0: 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69   it "TEXT".  Thi
5e00: 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20  s is really.    
5e10: 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67      ** something
5e20: 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49   of a bug, but I
5e30: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
5e40: 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
5e50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
5e60: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73  * This code does
5e70: 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65   not produce the
5e80: 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
5e90: 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e  - it just preven
5ea0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ts.        ** a 
5eb0: 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74  segfault.  See t
5ec0: 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20  icket #1229..   
5ed0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
5ee0: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
5ef0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
5f10: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
5f20: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
5f30: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
5f40: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
5f50: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
5f60: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
5f70: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
5f80: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
5f90: 7b 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20  {.        zType 
5fa0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
5fb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5fc0: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
5fd0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
5fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6000: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6010: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6020: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
6030: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
6040: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c  t sNC;.      Sel
6050: 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d  ect *pS = pExpr-
6060: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
6070: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
6080: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
6090: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
60a0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
60b0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
60c0: 54 79 70 65 28 26 73 4e 43 2c 20 70 53 2d 3e 70  Type(&sNC, pS->p
60d0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
60e0: 72 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  r); .      break
60f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6100: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
6110: 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 7d    zType = 0;.  }
6120: 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 7a 54 79  .  .  return zTy
6130: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
6140: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
6150: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
6160: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
6170: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
6180: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
6190: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
61a0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
61b0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
61c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
61d0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
61e0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
61f0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
6200: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
6210: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6220: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
6230: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
6240: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
6250: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
6260: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
6270: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
6280: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
6290: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
62a0: 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  TabList;.  for(i
62b0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
62c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
62d0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
62e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
62f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
6300: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
6310: 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20 20 69 66  &sNC, p);.    if
6320: 28 20 7a 54 79 70 65 3d 3d 30 20 29 20 63 6f 6e  ( zType==0 ) con
6330: 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a 20 54 68  tinue;.    /* Th
6340: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
6350: 20 69 74 27 73 20 6f 77 6e 20 63 6f 70 79 20 6f   it's own copy o
6360: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
6370: 65 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 0a  e, in case the .
6380: 20 20 20 20 2a 2a 20 73 63 68 65 6d 61 20 69 73      ** schema is
6390: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
63a0: 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
63b0: 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20  ne is deleted.. 
63c0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
63d0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
63e0: 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  v, i+pEList->nEx
63f0: 70 72 2c 20 7a 54 79 70 65 2c 20 73 74 72 6c 65  pr, zType, strle
6400: 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20 7d 0a 7d  n(zType));.  }.}
6410: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
6420: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
6430: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
6440: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
6450: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
6460: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
6470: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
6480: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
6490: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
64a0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
64b0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
64c0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
64d0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
64e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
64f0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
6500: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
6510: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
6520: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
6530: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6540: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
6550: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
6560: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
6570: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
6580: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
6590: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
65a0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
65b0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
65c0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
65d0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
65e0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
65f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
6600: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
6610: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
6620: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
6630: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
6640: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6650: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6660: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
6670: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
6680: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c  0 || sqlite3_mal
6690: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74  loc_failed ) ret
66a0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
66b0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
66c0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
66d0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
66e0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
66f0: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
6700: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
6710: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
6720: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
6730: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
6740: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
6750: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
6760: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
6770: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
6780: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
6790: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
67a0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
67b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
67c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
67d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
67e0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
67f0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
6800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6810: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
6820: 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a   zName, strlen(z
6830: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f  Name));.      co
6840: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
6850: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
6860: 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69  COLUMN && pTabLi
6870: 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  st ){.      Tabl
6880: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63  e *pTab;.      c
6890: 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
68a0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69   int iCol = p->i
68b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f  Column;.      fo
68c0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73  r(j=0; j<pTabLis
68d0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
68e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
68f0: 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b  r!=p->iTable; j+
6900: 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72  +){}.      asser
6910: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
6920: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
6930: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
6940: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
6950: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
6960: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
6970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
6980: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
6990: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
69a0: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
69b0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
69c0: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
69d0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
69e0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
69f0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
6a00: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
6a10: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
6a20: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
6a30: 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e  Names && p->span
6a40: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
6a50: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0] ){.        sq
6a60: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
6a70: 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61  ame(v, i, p->spa
6a80: 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b  n.z, p->span.n);
6a90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6aa0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21   fullNames || (!
6ab0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54  shortNames && pT
6ac0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20  abList->nSrc>1) 
6ad0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6ae0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
6af0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a      char *zTab;.
6b00: 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d   .        zTab =
6b10: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
6b20: 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  zAlias;.        
6b30: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
6b40: 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20   zTab==0 ) zTab 
6b50: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6b70: 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20  tString(&zName, 
6b80: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
6b90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
6ba0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6bb0: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
6bc0: 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P3_DYNAMIC);.   
6bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
6bf0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 43  ColName(v, i, zC
6c00: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
6c10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6c20: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e  else if( p->span
6c30: 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b  .z && p->span.z[
6c40: 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0] ){.      sqli
6c50: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
6c60: 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e  e(v, i, p->span.
6c70: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
6c80: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56       /* sqlite3V
6c90: 64 62 65 43 6f 6d 70 72 65 73 73 53 70 61 63 65  dbeCompressSpace
6ca0: 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f 0a 20 20  (v, addr); */.  
6cb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
6cc0: 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20  har zName[30];. 
6cd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
6ce0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
6cf0: 20 70 54 61 62 4c 69 73 74 3d 3d 30 20 29 3b 0a   pTabList==0 );.
6d00: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4e        sprintf(zN
6d10: 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c  ame, "column%d",
6d20: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c   i+1);.      sql
6d30: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6d40: 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  me(v, i, zName, 
6d50: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
6d60: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
6d70: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
6d80: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
6d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6da0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
6db0: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
6dc0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
6dd0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
6de0: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
6df0: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
6e10: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
6e20: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
6e30: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
6e40: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
6e50: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
6e60: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
6e70: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
6e80: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
6e90: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
6ea0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
6eb0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
6ec0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
6ed0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
6ee0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6ef0: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
6f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
6f10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6f20: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6f30: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
6f40: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
6f50: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
6f60: 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53   int prepSelectS
6f70: 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c 65  tmt(Parse*, Sele
6f80: 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ct*);../*.** Giv
6f90: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
6fa0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
6fb0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
6fc0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
6fd0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
6fe0: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
6ff0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
7000: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
7010: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
7020: 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62 4e  rse, char *zTabN
7030: 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ame, Select *pSe
7040: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
7050: 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  pTab;.  int i, j
7060: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
7070: 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  List;.  Column *
7080: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20 20  aCol, *pCol;..  
7090: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
70a0: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
70b0: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
70c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
70d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
70e0: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  lve(pParse, pSel
70f0: 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  ect, 0) ){.    r
7100: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
7110: 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Tab = sqliteMall
7120: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
7130: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
7140: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
7150: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
7160: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7170: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
7180: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
7190: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
71a0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
71b0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
71c0: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
71d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
71e0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
71f0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
7200: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
7210: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
7220: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
7230: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
7240: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
7250: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
7260: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
7270: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
7280: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
7290: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
72a0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61  e;.    char *zBa
72b0: 73 65 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  sename;.    int 
72c0: 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  cnt;.    NameCon
72d0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 0a 20  text sNC;.    . 
72e0: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
72f0: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
7300: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
7310: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69   */.    p = pELi
7320: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7330: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
7340: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Right==0 || p->p
7350: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  Right->token.z==
7360: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
7370: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b  token.z[0]!=0 );
7380: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
7390: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
73a0: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
73b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
73c0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
73d0: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
73e0: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
73f0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
7400: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
7410: 65 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a  eStrDup(zName);.
7420: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
7430: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a 20 20 20  >op==TK_DOT .   
7440: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
7450: 52 3d 70 2d 3e 70 52 69 67 68 74 29 21 3d 30 20  R=p->pRight)!=0 
7460: 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26  && pR->token.z &
7470: 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pR->token.z[0]
7480: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
7490: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
74a0: 66 72 6f 6d 20 41 2e 42 20 75 73 65 20 42 20 61  from A.B use B a
74b0: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
74c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
74d0: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c  te3MPrintf("%T",
74e0: 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20   &pR->token);.  
74f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
7500: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
7510: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
7520: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
7530: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
7540: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
7550: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
7560: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
7570: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 54  lite3MPrintf("%T
7580: 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b 0a 20 20  ", &p->span);.  
7590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
75a0: 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65 20 66 61  * If all else fa
75b0: 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20 61 20 6e  ils, make up a n
75c0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
75d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
75e0: 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  ntf("column%d", 
75f0: 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i+1);.    }.    
7600: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
7610: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
7620: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
7630: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
7640: 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d 65 29 3b  liteFree(zName);
7650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
7660: 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61  leteTable(0, pTa
7670: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
7680: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7690: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
76a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
76b0: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
76c0: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
76d0: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
76e0: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
76f0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
7700: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
7710: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 42 61  ..    */.    zBa
7720: 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  sename = zName;.
7730: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
7740: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
7750: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
7760: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
7770: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
7780: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
7790: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
77a0: 22 25 73 3a 25 64 22 2c 20 7a 42 61 73 65 6e 61  "%s:%d", zBasena
77b0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
77c0: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
77d0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
77e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
77f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7800: 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e 61 6d 65  zBasename!=zName
7810: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7820: 46 72 65 65 28 7a 42 61 73 65 6e 61 6d 65 29 3b  Free(zBasename);
7830: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
7840: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
7850: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
7860: 74 79 70 65 6e 61 6d 65 2c 20 74 79 70 65 20 61  typename, type a
7870: 66 66 69 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c  ffinity, and col
7880: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7890: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  for the.    ** c
78a0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
78b0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
78c0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
78d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
78e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
78f0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71  ;.    zType = sq
7900: 6c 69 74 65 53 74 72 44 75 70 28 63 6f 6c 75 6d  liteStrDup(colum
7910: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 29 29 3b  nType(&sNC, p));
7920: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
7930: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
7940: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
7950: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
7960: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  ty(p);.    pCol-
7970: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
7980: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
7990: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
79a0: 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 29 7b 0a  !pCol->pColl ){.
79b0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c        pCol->pCol
79c0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
79d0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d  pDfltColl;.    }
79e0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b  .  }.  pTab->iPK
79f0: 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ey = -1;.  retur
7a00: 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
7a10: 20 50 72 65 70 61 72 65 20 61 20 53 45 4c 45 43   Prepare a SELEC
7a20: 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
7a30: 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f  processing by do
7a40: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
7a50: 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a  g.** things:.**.
7a60: 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
7a70: 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
7a80: 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
7a90: 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
7aa0: 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
7ab0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
7ac0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
7ad0: 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
7ae0: 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
7af0: 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
7b00: 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
7b10: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
7b20: 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
7b30: 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
7b40: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
7b50: 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
7b60: 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
7b70: 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
7b80: 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
7b90: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7ba0: 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
7bb0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
7bc0: 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
7bd0: 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
7be0: 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
7bf0: 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
7c00: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
7c10: 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
7c20: 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
7c30: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
7c40: 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
7c50: 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
7c60: 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65 73  sing up the pres
7c70: 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
7c80: 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
7c90: 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
7ca0: 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
7cb0: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
7cc0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
7cd0: 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  omodate the NATU
7ce0: 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
7cf0: 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
7d00: 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
7d10: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
7d20: 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
7d30: 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
7d40: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
7d50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
7d60: 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
7d70: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
7d80: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
7d90: 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
7da0: 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
7db0: 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
7dc0: 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
7dd0: 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
7de0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
7df0: 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
7e00: 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
7e10: 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
7e20: 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
7e30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
7e40: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
7e50: 74 68 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65  there are proble
7e60: 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ms, leave an err
7e70: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
7e80: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
7e90: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
7ea0: 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 70 53  static int prepS
7eb0: 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73 65 20  electStmt(Parse 
7ec0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
7ed0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
7ee0: 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73   k, rc;.  SrcLis
7ef0: 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45  t *pTabList;.  E
7f00: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7f10: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
7f20: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
7f30: 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
7f40: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
7f50: 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  pSrc==0 || sqlit
7f60: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
7f70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
7f80: 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
7f90: 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
7fa0: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
7fb0: 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
7fc0: 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
7fd0: 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
7fe0: 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
7ff0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
8000: 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
8010: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
8020: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
8030: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
8040: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
8050: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
8060: 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
8070: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
8080: 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
8090: 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
80a0: 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
80b0: 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
80c0: 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
80d0: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
80e0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
80f0: 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
8100: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
8110: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
8120: 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
8130: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
8140: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
8150: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
8160: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
8170: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
8180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
8190: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
81a0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
81b0: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
81c0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
81d0: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
81e0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
81f0: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
8200: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
8210: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
8220: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
8230: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8240: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
8250: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
8260: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
8270: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
8280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8290: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
82a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
82b0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29  rom->zAlias==0 )
82c0: 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  {.        pFrom-
82d0: 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20  >zAlias =.      
82e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
82f0: 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75  tf("sqlite_subqu
8300: 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
8310: 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29  )pFrom->pSelect)
8320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8330: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
8340: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
8350: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
8360: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
8370: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8380: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
8390: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46  From->zAlias, pF
83a0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
83b0: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
83c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
83d0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
83e0: 20 20 20 20 2f 2a 20 54 68 65 20 69 73 54 72 61      /* The isTra
83f0: 6e 73 69 65 6e 74 20 66 6c 61 67 20 69 6e 64 69  nsient flag indi
8400: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54  cates that the T
8410: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  able structure h
8420: 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a  as been.      **
8430: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
8440: 6f 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62  ocated and may b
8450: 65 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74  e freed at any t
8460: 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ime.  In other w
8470: 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70  ords,.      ** p
8480: 54 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  Tab is not point
8490: 69 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74  ing to a persist
84a0: 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
84b0: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
84c0: 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
84d0: 66 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f  f the schema. */
84e0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 54  .      pTab->isT
84f0: 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b 0a 23 65  ransient = 1;.#e
8500: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
8510: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
8520: 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
8530: 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
8540: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
8550: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
8560: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
8570: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
8580: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
8590: 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54    sqlite3LocateT
85a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72 6f  able(pParse,pFro
85b0: 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e  m->zName,pFrom->
85c0: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
85d0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
85e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
85f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
8600: 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
8610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8620: 49 54 5f 56 49 45 57 0a 20 20 20 20 20 20 69 66  IT_VIEW.      if
8630: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
8640: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
8650: 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
8660: 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
8670: 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
8680: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
8690: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
86a0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
86b0: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
86c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
86d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
86e0: 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
86f0: 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
8700: 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
8710: 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
8720: 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
8730: 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
8740: 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
8750: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
8760: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
8770: 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
8780: 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
8790: 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
87a0: 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
87b0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
87c0: 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
87d0: 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
87e0: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
87f0: 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
8800: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
8810: 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62 2d  3SelectDup(pTab-
8820: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
8830: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
8840: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  dif.    }.  }.. 
8850: 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
8860: 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
8870: 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
8880: 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
8890: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
88a0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
88b0: 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75 72  arse, p) ) retur
88c0: 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  n 1;..  /* For e
88d0: 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
88e0: 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
88f0: 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
8900: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
8910: 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
8920: 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
8930: 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
8940: 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
8950: 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
8960: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
8970: 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
8980: 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
8990: 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
89a0: 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 4c  * with the TK_AL
89b0: 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  L operator for e
89c0: 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
89d0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
89e0: 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54  umn list..  ** T
89f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
8a00: 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
8a10: 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20  cate the TK_ALL 
8a20: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
8a30: 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68  expand.  ** each
8a40: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
8a50: 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
8a60: 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  in all tables.. 
8a70: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
8a80: 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
8a90: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
8aa0: 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
8ab0: 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
8ac0: 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
8ad0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
8ae0: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
8af0: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 45  xpr; k++){.    E
8b00: 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73 74  xpr *pE = pEList
8b10: 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[k].pExpr;.  
8b20: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
8b30: 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
8b40: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
8b50: 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
8b60: 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  ht && pE->pRight
8b70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20  ->op==TK_ALL.   
8b80: 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c 65        && pE->pLe
8b90: 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  ft && pE->pLeft-
8ba0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72 65  >op==TK_ID ) bre
8bb0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30  ak;.  }.  rc = 0
8bc0: 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  ;.  if( k<pEList
8bd0: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
8be0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
8bf0: 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
8c00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8c10: 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
8c20: 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
8c30: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
8c40: 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
8c50: 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
8c60: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
8c70: 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
8c80: 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
8c90: 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
8ca0: 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
8cb0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
8cc0: 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
8cd0: 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
8ce0: 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
8cf0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
8d00: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
8d10: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
8d20: 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
8d30: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
8d40: 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20  es)!=0 &&.      
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
8d70: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
8d80: 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
8d90: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
8da0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
8db0: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
8dc0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
8dd0: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
8de0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
8df0: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
8e00: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
8e10: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
8e20: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
8e30: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
8e40: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
8e50: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
8e60: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
8e70: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8e80: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8e90: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
8ea0: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
8eb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
8ec0: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
8ed0: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
8ee0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8ef0: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
8f00: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
8f10: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
8f20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
8f30: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
8f40: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
8f50: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
8f60: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
8f70: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
8f80: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
8f90: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
8fa0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
8fb0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
8fc0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
8fd0: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
8fe0: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
8ff0: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
9000: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
9010: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
9020: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
9030: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
9040: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9050: 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  n(&pE->pLeft->to
9060: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
9070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
9080: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
9090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
90a0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
90b0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
90c0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
90d0: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
90e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
90f0: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
9100: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
9110: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
9120: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
9130: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
9140: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
9150: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
9160: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
9170: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
9180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9190: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
91a0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
91b0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
91c0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
91d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
91e0: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
91f0: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
9200: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
9210: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
9220: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
9230: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
9240: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
9250: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
9260: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
9270: 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20  *pExpr, *pLeft, 
9280: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
9290: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
92a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
92b0: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
92c0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
92e0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
92f0: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
9300: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9320: 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65  (pLeft->jointype
9330: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
9340: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
9360: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
9370: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
9380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9390: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
93a0: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
93b0: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
93c0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
93d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
93e0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
93f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
9400: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9410: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9420: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
9430: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
9440: 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20  (pLeft->pUsing, 
9450: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9470: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
9480: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
9490: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
94a0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
94b0: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
94c0: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
94d0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
94e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
94f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
9500: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9510: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9520: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
9530: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
9540: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
9550: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
9560: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
9570: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
9580: 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f  oken(&pRight->to
9590: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
95a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
95b0: 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61  bName && (longNa
95c0: 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
95d0: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
95e0: 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
95f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
9600: 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
9620: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
9630: 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20  (TK_DOT, pLeft, 
9640: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
9650: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
9660: 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  xpr==0 ) break;.
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9680: 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74  tToken(&pLeft->t
9690: 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  oken, zTabName);
96a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
96b0: 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e  etToken(&pExpr->
96c0: 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72  span, sqlite3MPr
96d0: 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54  intf("%s.%s", zT
96e0: 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b  abName, zName));
96f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9700: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d  Expr->span.dyn =
9710: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
9720: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
9730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9740: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
9750: 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
9760: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
9770: 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  en.dyn = 0;.    
9780: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
97a0: 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
97b0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
97c0: 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e  ->span = pExpr->
97d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20  token;.         
97e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
97f0: 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
9800: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9810: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
9820: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65  prListAppend(pNe
9830: 77 2c 20 70 45 78 70 72 2c 20 26 70 45 78 70 72  w, pExpr, &pExpr
9840: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20  ->span);.       
9850: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9860: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
9870: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9880: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78  Append(pNew, pEx
9890: 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  pr, &pRight->tok
98a0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
98b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
98c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
98d0: 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
98e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
98f0: 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
9900: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
9910: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9920: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
9930: 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
9940: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9950: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9970: 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
9980: 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
9990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
99a0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
99b0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
99c0: 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20  Free(zTName);.  
99d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
99e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
99f0: 65 6c 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20  elete(pEList);. 
9a00: 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70     p->pEList = p
9a10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
9a20: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
9a30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
9a40: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
9a50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9a60: 61 73 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69  associates entri
9a70: 65 73 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  es in an ORDER B
9a80: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  Y expression lis
9a90: 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  t with.** column
9aa0: 73 20 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20  s in a result.  
9ab0: 46 6f 72 20 65 61 63 68 20 4f 52 44 45 52 20 42  For each ORDER B
9ac0: 59 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  Y expression, th
9ad0: 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74  e opcode of.** t
9ae0: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64  he top-level nod
9af0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
9b00: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
9b10: 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  e iColumn value 
9b20: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
9b30: 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c  vel node is fill
9b40: 65 64 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d  ed in with colum
9b50: 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  n number and the
9b60: 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65   iTable.** value
9b70: 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65   of the top-leve
9b80: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
9b90: 20 77 69 74 68 20 69 54 61 62 6c 65 20 70 61 72   with iTable par
9ba0: 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ameter..**.** If
9bb0: 20 74 68 65 72 65 20 61 72 65 20 70 72 69 6f 72   there are prior
9bc0: 20 53 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c   SELECT clauses,
9bd0: 20 74 68 65 79 20 61 72 65 20 70 72 6f 63 65 73   they are proces
9be0: 73 65 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61  sed first.  A ma
9bf0: 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72  tch.** in an ear
9c00: 6c 69 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65  lier SELECT take
9c10: 73 20 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65  s precedence ove
9c20: 72 20 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54  r a later SELECT
9c30: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72  ..**.** Any entr
9c40: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  y that does not 
9c50: 6d 61 74 63 68 20 69 73 20 66 6c 61 67 67 65 64  match is flagged
9c60: 20 61 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   as an error.  T
9c70: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
9c80: 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e  errors is return
9c90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
9ca0: 74 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  t matchOrderbyTo
9cb0: 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20  Column(.  Parse 
9cc0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9cd0: 20 20 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20    /* A place to 
9ce0: 6c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  leave error mess
9cf0: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
9d00: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
9d10: 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65    /* Match to re
9d20: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  sult columns of 
9d30: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
9d40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
9d50: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
9d60: 4f 52 44 45 52 20 42 59 20 76 61 6c 75 65 73 20  ORDER BY values 
9d70: 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74  to match against
9d80: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
9d90: 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
9da0: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
9db0: 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54  this value in iT
9dc0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
9dd0: 73 74 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20  stComplete      
9de0: 20 20 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c    /* If TRUE all
9df0: 20 4f 52 44 45 52 20 42 59 73 20 6d 75 73 74 20   ORDER BYs must 
9e00: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
9e10: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e  t nErr = 0;.  in
9e20: 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69  t i, j;.  ExprLi
9e30: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69  st *pEList;..  i
9e40: 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c  f( pSelect==0 ||
9e50: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
9e60: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d  eturn 1;.  if( m
9e70: 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20  ustComplete ){. 
9e80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
9e90: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9ea0: 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61  ++){ pOrderBy->a
9eb0: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a  [i].done = 0; }.
9ec0: 20 20 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65    }.  if( prepSe
9ed0: 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c  lectStmt(pParse,
9ee0: 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
9ef0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9f00: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50   if( pSelect->pP
9f10: 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
9f20: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
9f30: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65  lumn(pParse, pSe
9f40: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f  lect->pPrior, pO
9f50: 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
9f60: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
9f70: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
9f80: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
9f90: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f  ct->pEList;.  fo
9fa0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
9fb0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
9fc0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9fd0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
9fe0: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  xpr;.    int iCo
9ff0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  l = -1;.    if( 
a000: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
a010: 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  one ) continue;.
a020: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
a030: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
a040: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
a050: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
a060: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
a070: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
a080: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a090: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
a0a0: 22 4f 52 44 45 52 20 42 59 20 70 6f 73 69 74 69  "ORDER BY positi
a0b0: 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20  on %d should be 
a0c0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
a0d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  ",.          iCo
a0e0: 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
a0f0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
a100: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
a110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a120: 69 66 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74  if( !mustComplet
a130: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a140: 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20      iCol--;.    
a150: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69  }.    for(j=0; i
a160: 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73  Col<0 && j<pELis
a170: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
a180: 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
a190: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20  ->a[j].zName && 
a1a0: 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c  (pE->op==TK_ID |
a1b0: 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  | pE->op==TK_STR
a1c0: 49 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ING) ){.        
a1d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c  char *zName, *zL
a1e0: 61 62 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e  abel;.        zN
a1f0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
a200: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
a210: 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74    zLabel = sqlit
a220: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
a230: 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  &pE->token);.   
a240: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61       assert( zLa
a250: 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  bel!=0 );.      
a260: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a270: 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62  ICmp(zName, zLab
a280: 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  el)==0 ){ .     
a290: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
a2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a2b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62   sqliteFree(zLab
a2c0: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
a2d0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26     if( iCol<0 &&
a2e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
a2f0: 61 72 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e  are(pE, pEList->
a300: 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[j].pExpr) ){. 
a310: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b         iCol = j;
a320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a330: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
a340: 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d  {.      pE->op =
a350: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
a360: 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20    pE->iColumn = 
a370: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e  iCol;.      pE->
a380: 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  iTable = iTable;
a390: 0a 20 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20  .      pE->iAgg 
a3a0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64  = -1;.      pOrd
a3b0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
a3c0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
a3d0: 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73  f( iCol<0 && mus
a3e0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
a3f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a400: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
a410: 20 20 20 22 4f 52 44 45 52 20 42 59 20 74 65 72     "ORDER BY ter
a420: 6d 20 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73  m number %d does
a430: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72   not match any r
a440: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69  esult column", i
a450: 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  +1);.      nErr+
a460: 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  +;.      break;.
a470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a480: 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
a490: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
a4a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a4b0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
a4c0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
a4d0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
a4e0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
a4f0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
a500: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
a510: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
a520: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
a530: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
a540: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
a550: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
a560: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
a570: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
a580: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a590: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
a5a0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
a5b0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
a5c0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
a5d0: 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  e->db);.  }.  re
a5e0: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn v;.}../*.**
a5f0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
a600: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
a610: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
a620: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
a630: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
a640: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
a650: 6f 6e 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64  ons.  nLimit and
a660: 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   nOffset hold th
a670: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
a680: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
a690: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
a6a0: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
a6b0: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
a6c0: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
a6d0: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
a6e0: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
a6f0: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
a700: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
a710: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
a720: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
a730: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
a740: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
a750: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
a760: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
a770: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
a780: 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
a790: 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
a7a0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
a7b0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
a7c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a7d0: 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
a7e0: 61 6c 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20  alues if iLimit 
a7f0: 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
a800: 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
a810: 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
a820: 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e  ned by nLimit an
a830: 64 20 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d nOffset.  iLim
a840: 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
a850: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
a860: 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
a870: 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
a880: 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61   values.** (usua
a890: 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61  lly but not alwa
a8a0: 79 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20  ys -1) prior to 
a8b0: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
a8c0: 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66  tine..** Only if
a8d0: 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f   nLimit>=0 or nO
a8e0: 66 66 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c  ffset>0 do the l
a8f0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
a900: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
a910: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
a920: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
a930: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
a940: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
a950: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
a960: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
a970: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
a980: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
a990: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
a9a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
a9b0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
a9c0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
a9d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
a9e0: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
a9f0: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
aa00: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
aa10: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
aa20: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
aa30: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
aa40: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
aa50: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
aa60: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
aa70: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
aa80: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
aa90: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
aaa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
aab0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  pLimit ){.    in
aac0: 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  t iMem = pParse-
aad0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62  >nMem++;.    Vdb
aae0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
aaf0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ab00: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
ab10: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
ab20: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ab30: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
ab40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ab50: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
ab60: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nt, 0, 0);.    s
ab70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ab80: 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20  v, OP_Negative, 
ab90: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
aba0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
abb0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d  P_MemStore, iMem
abc0: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
abd0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d  mment((v, "# LIM
abe0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
abf0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69     p->iLimit = i
ac00: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
ac10: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
ac20: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
ac30: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
ac40: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ac50: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ac60: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ac70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
ac80: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ac90: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  rse, p->pOffset)
aca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
acb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
acc0: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
acd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ace0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69  dOp(v, OP_Negati
acf0: 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ve, 0, 0);.    s
ad00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ad10: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
ad20: 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64  iMem, 1);.    Vd
ad30: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
ad40: 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22   OFFSET counter"
ad50: 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73  ));.    p->iOffs
ad60: 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d  et = iMem;.  }.}
ad70: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
ad80: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
ad90: 20 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74   to use for sort
ada0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
adb0: 6f 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e  oid createSortin
adc0: 67 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  gIndex(Parse *pP
add0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
ade0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
adf0: 72 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64  rBy){.  if( pOrd
ae00: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
ae10: 61 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  addr;.    assert
ae20: 28 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  ( pOrderBy->iECu
ae30: 72 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70  rsor==0 );.    p
ae40: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
ae50: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
ae60: 2b 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  ++;.    addr = s
ae70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ae80: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
ae90: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 0a 20  P_OpenVirtual,. 
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
aec0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
aed0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
aee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
aef0: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
af00: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70  ] == -1 );.    p
af10: 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32  ->addrOpenVirt[2
af20: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a  ] = addr;.  }.}.
af30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70 63 6f 64  ./*.** The opcod
af40: 65 20 61 74 20 61 64 64 72 20 69 73 20 61 6e 20  e at addr is an 
af50: 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 74  OP_OpenVirtual t
af60: 68 61 74 20 63 72 65 61 74 65 64 20 61 20 73 6f  hat created a so
af70: 72 74 69 6e 67 0a 2a 2a 20 69 6e 64 65 78 20 74  rting.** index t
af80: 68 61 20 77 65 20 65 6e 64 65 64 20 75 70 20 6e  ha we ended up n
af90: 6f 74 20 6e 65 65 64 69 6e 67 2e 20 20 54 68 69  ot needing.  Thi
afa0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
afb0: 73 20 74 68 61 74 0a 2a 2a 20 6f 70 63 6f 64 65  s that.** opcode
afc0: 20 74 6f 20 4f 50 5f 4e 6f 6f 70 2e 0a 2a 2f 0a   to OP_Noop..*/.
afd0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 63 72  static void uncr
afe0: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
aff0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b000: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62  int addr){.  Vdb
b010: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b020: 56 64 62 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a  Vdbe;.  VdbeOp *
b030: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
b040: 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72 29 3b  eGetOp(v, addr);
b050: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
b060: 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
b070: 30 2c 20 30 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70  0, 0);.  pOp->op
b080: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
b090: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20    pOp->p1 = 0;. 
b0a0: 20 70 4f 70 2d 3e 70 32 20 3d 20 30 3b 0a 7d 0a   pOp->p2 = 0;.}.
b0b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b0c0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
b0d0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
b0e0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
b0f0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b100: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
b110: 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
b120: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
b130: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
b140: 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
b150: 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
b160: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
b170: 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
b180: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
b190: 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
b1a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
b1b0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
b1c0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
b1d0: 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
b1e0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
b1f0: 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
b200: 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
b210: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
b220: 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
b230: 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
b240: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
b250: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
b260: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
b270: 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
b280: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
b290: 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
b2a0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
b2b0: 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
b2c0: 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
b2d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
b2e0: 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29  .  if( pRet==0 )
b2f0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
b300: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
b310: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
b320: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
b330: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b340: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
b350: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
b360: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
b370: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b380: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b390: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
b3a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b3b0: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
b3c0: 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72 65  query that is re
b3d0: 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a  ally the union.*
b3e0: 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69 6f  * or intersectio
b3f0: 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  n of two or more
b400: 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
b410: 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  s..**.** "p" poi
b420: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
b430: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
b440: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
b450: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
b460: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
b470: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
b480: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
b490: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
b4a0: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
b4b0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
b4c0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
b4d0: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
b4e0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
b4f0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
b500: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
b510: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
b520: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
b530: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
b540: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
b550: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
b560: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
b570: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
b580: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
b590: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
b5a0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
b5b0: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
b5c0: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
b5d0: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
b5e0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
b5f0: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
b600: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
b610: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b620: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
b630: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
b640: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
b680: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
b690: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
b6a0: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
b6b0: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
b6c0: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
b6d0: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
b6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b6f0: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
b700: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
b710: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
b720: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
b730: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
b740: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
b750: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
b760: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
b770: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
b780: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
b790: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
b7a0: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
b7b0: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
b7c0: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
b7d0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
b7e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
b7f0: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
b800: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b810: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b820: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
b830: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b840: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
b850: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
b860: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
b870: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
b880: 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f      /* \___  Sto
b890: 72 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  re query results
b8a0: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 2a 2f   as specified */
b8b0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
b8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20 20 20           /* /   
b8d0: 20 20 62 79 20 74 68 65 73 65 20 74 77 6f 20 70    by these two p
b8e0: 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20 20 20  arameters.      
b8f0: 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66     */.  char *af
b900: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f             /*
b910: 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52 54   If eDest is SRT
b920: 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66 69  _Union, the affi
b930: 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
b940: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
b950: 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
b960: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
b970: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b980: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
b990: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
b9a0: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
b9b0: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
b9c0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
b9e0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b9f0: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69  this VDBE */.  i
ba00: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
ba10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ba20: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
ba30: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
ba40: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ba50: 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
ba60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
ba70: 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74   p */.  int aSet
ba80: 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  P2[2];        /*
ba90: 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f 66   Set P2 value of
baa0: 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d   these op to num
bab0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
bac0: 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20 3d  /.  int nSetP2 =
bad0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
bae0: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20  ber of slots in 
baf0: 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f  aSetP2[] used */
bb00: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
bb10: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
bb20: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
bb30: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
bb40: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
bb50: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
bb60: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
bb70: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
bb80: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
bb90: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
bba0: 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  /.  if( p==0 || 
bbb0: 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
bbc0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bbd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bbe0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72  t_end;.  }.  pPr
bbf0: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
bc00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
bc10: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
bc20: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
bc30: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
bc40: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
bc50: 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70 50  most );.  if( pP
bc60: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
bc70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bc80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
bc90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
bca0: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
bcb0: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
bcc0: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
bcd0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
bce0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
bcf0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
bd00: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
bd10: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
bd20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bd30: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
bd40: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
bd50: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
bd60: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
bd70: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
bd80: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
bd90: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
bda0: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bdb0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
bdc0: 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69 64   we have a valid
bdd0: 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20 20   query engine.  
bde0: 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20 61  If not, create a
bdf0: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
be00: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
be10: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
be20: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( v==0 ){.    r
be30: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
be40: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
be50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
be60: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
be70: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
be80: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
be90: 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
bea0: 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  ==SRT_VirtualTab
beb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bec0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
bed0: 20 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c   assert( nSetP2<
bee0: 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73  sizeof(aSetP2)/s
bef0: 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29  izeof(aSetP2[0])
bf00: 20 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b 6e   );.    aSetP2[n
bf10: 53 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74  SetP2++] = sqlit
bf20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bf30: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69  P_OpenVirtual, i
bf40: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44  Parm, 0);.    eD
bf50: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
bf60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
bf70: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
bf80: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
bf90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bfa0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72  s..  */.  pOrder
bfb0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
bfc0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  ;.  switch( p->o
bfd0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
bfe0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66  _ALL: {.      if
bff0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  ( pOrderBy==0 ){
c000: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c010: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
c020: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
c030: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
c040: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
c050: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
c060: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
c070: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c080: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c090: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
c0a0: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c0b0: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  aff);.        if
c0c0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c0d0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c0e0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
c0f0: 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50   }.        p->pP
c100: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
c110: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
c120: 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
c130: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c140: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c150: 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  et;.        p->p
c160: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
c170: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c180: 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
c190: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c1a0: 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20  arse, p, eDest, 
c1b0: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
c1c0: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
c1d0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
c1e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
c1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
c200: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c210: 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  end;.        }. 
c220: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c230: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
c240: 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e  or UNION ALL ...
c250: 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74   ORDER BY fall t
c260: 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
c270: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  xt case */.    }
c280: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
c290: 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
c2a0: 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
c2b0: 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
c2c0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c2d0: 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
c2e0: 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
c2f0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
c300: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20   int op = 0;    
c310: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
c320: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
c330: 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
c340: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
c350: 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
c360: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
c370: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
c380: 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
c390: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
c3a0: 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
c3b0: 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
c3c0: 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
c3d0: 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
c3e0: 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20   int addr;..    
c3f0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f    priorOp = p->o
c400: 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f  p==TK_ALL ? SRT_
c410: 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f  Table : SRT_Unio
c420: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  n;.      if( eDe
c430: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70  st==priorOp && p
c440: 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70  OrderBy==0 && !p
c450: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e  ->pLimit && !p->
c460: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
c470: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
c480: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
c490: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
c4a0: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
c4b0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
c4c0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
c4d0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
c4e0: 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  = iParm;.      }
c4f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c500: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
c510: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
c520: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c530: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
c540: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
c550: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
c560: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c570: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
c580: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
c590: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
c5a0: 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  && matchOrderbyT
c5b0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
c5c0: 70 2c 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69  p, pOrderBy, uni
c5d0: 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20  onTab,1) ){.    
c5e0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
c5f0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c600: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c620: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c630: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
c640: 70 65 6e 56 69 72 74 75 61 6c 2c 20 75 6e 69 6f  penVirtual, unio
c650: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
c660: 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
c670: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
c680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
c690: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
c6a0: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
c6b0: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
c6c0: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
c6d0: 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
c6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c700: 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 30 5d 20  addrOpenVirt[0] 
c710: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
c720: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
c730: 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[0] = addr;.  
c740: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
c750: 74 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20  tmost->usesVirt 
c760: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
c770: 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
c780: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
c790: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
c7a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c7b0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
c7c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c7d0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
c7e0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
c7f0: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
c800: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
c810: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
c820: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c830: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c840: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
c850: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
c860: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
c870: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c880: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c890: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c8a0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
c8b0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
c8c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
c8d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
c8e0: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
c8f0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
c900: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
c910: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
c920: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
c930: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
c940: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
c950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c960: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
c970: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
c980: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
c990: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
c9a0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
c9b0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
c9c0: 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
c9d0: 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
c9e0: 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
c9f0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
ca00: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
ca10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
ca20: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
ca30: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
ca40: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
ca50: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ca60: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
ca70: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
ca80: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
ca90: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
caa0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
cab0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
cac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
cad0: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
cae0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
caf0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
cb00: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
cb10: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
cb20: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31    p->iLimit = -1
cb30: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
cb40: 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  et = -1;.      i
cb50: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
cb60: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
cb70: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
cb80: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
cb90: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
cba0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
cbb0: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
cbc0: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
cbd0: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
cbe0: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
cbf0: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
cc00: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
cc10: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
cc20: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
cc30: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
cc40: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
cc50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
cc60: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
cc70: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
cc80: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
cc90: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
cca0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
ccb0: 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69 73 74  se, 0, p->pEList
ccc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ccd0: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
cce0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ccf0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
cd00: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
cd10: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cd20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cd30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
cd40: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
cd50: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
cd60: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
cd70: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
cd80: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  p);.        iSta
cd90: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
cda0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
cdb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c          rc = sel
cdc0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
cdd0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
cde0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
cdf0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
ce20: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
ce30: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
ce60: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  eak, 0);.       
ce70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
ce80: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
ce90: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
cea0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
ceb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cec0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
ced0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
cee0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cef0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cf00: 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
cf10: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
cf20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
cf30: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
cf40: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
cf50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cf60: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
cf70: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
cf80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
cf90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
cfa0: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20  K_INTERSECT: {. 
cfb0: 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74       int tab1, t
cfc0: 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ab2;.      int i
cfd0: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
cfe0: 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72  tart;.      Expr
cff0: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
d000: 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  et;.      int ad
d010: 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  dr;..      /* IN
d020: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
d030: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
d040: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
d050: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
d060: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
d070: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
d080: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
d090: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
d0a0: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
d0b0: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
d0c0: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
d0d0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
d0e0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d0f0: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
d100: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
d110: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
d120: 26 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f  & matchOrderbyTo
d130: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c  Column(pParse,p,
d140: 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c 31 29  pOrderBy,tab1,1)
d150: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d160: 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
d170: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d180: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
d190: 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e   createSortingIn
d1a0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 70  dex(pParse, p, p
d1b0: 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 20  OrderBy);..     
d1c0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d1d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
d1e0: 70 65 6e 56 69 72 74 75 61 6c 2c 20 74 61 62 31  penVirtual, tab1
d1f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
d200: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56  rt( p->addrOpenV
d210: 69 72 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  irt[0] == -1 );.
d220: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
d230: 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b  nVirt[0] = addr;
d240: 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
d250: 6d 6f 73 74 2d 3e 75 73 65 73 56 69 72 74 20 3d  most->usesVirt =
d260: 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
d270: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
d280: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d290: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
d2a0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
d2b0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
d2c0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
d2d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
d2e0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
d2f0: 69 6f 72 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  ior, SRT_Union, 
d300: 74 61 62 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61  tab1, 0, 0, 0, a
d310: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ff);.      if( r
d320: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
d330: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d340: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
d350: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
d360: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
d370: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
d380: 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
d390: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
d3a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d3b0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
d3c0: 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
d3e0: 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d  ddrOpenVirt[1] =
d3f0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
d400: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d  >addrOpenVirt[1]
d410: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
d420: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
d430: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
d440: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
d450: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
d460: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
d470: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
d480: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
d490: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d4a0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d4b0: 70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  p, SRT_Union, ta
d4c0: 62 32 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  b2, 0, 0, 0, aff
d4d0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
d4e0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
d4f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d500: 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b  lete(p->pLimit);
d510: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
d520: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
d530: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
d540: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
d550: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
d560: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d570: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
d580: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
d590: 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68   code to take th
d5a0: 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  e intersection o
d5b0: 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72  f the two tempor
d5c0: 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  ary.      ** tab
d5d0: 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  les..      */.  
d5e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d5f0: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69  EList );.      i
d600: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
d610: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
d620: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
d630: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
d640: 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
d650: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
d660: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d670: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d680: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d690: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d6a0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
d6b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d6c0: 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
d6d0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 63 6f  Break);.      co
d6e0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
d6f0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ers(pParse, p);.
d700: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
d710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d720: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
d730: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
d740: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d750: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
d760: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
d770: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
d780: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d790: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
d7a0: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
d7b0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
d7e0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
d810: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
d820: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d830: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
d840: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d850: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d870: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d880: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
d890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d8a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
d8b0: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
d8c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d8d0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d8e0: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
d8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d900: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
d910: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
d920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d930: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
d940: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
d950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
d960: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
d970: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
d980: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
d990: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
d9a0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
d9b0: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
d9c0: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
d9d0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d9e0: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
d9f0: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
da00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
da10: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
da20: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
da30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
da40: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
da50: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
da60: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
da70: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
da80: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
da90: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
daa0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
dab0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
dac0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
dad0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
dae0: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
daf0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
db00: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
db10: 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f  ables.  */.  nCo
db20: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
db30: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Expr;.  while( n
db40: 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c  SetP2 ){.    sql
db50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
db60: 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65  (v, aSetP2[--nSe
db70: 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  tP2], nCol);.  }
db80: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
db90: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dba0: 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
dbb0: 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
dbc0: 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
dbd0: 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
dbe0: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
dbf0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
dc00: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
dc10: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
dc20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
dc30: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
dc40: 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
dc50: 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
dc60: 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
dc70: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
dc80: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
dc90: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
dca0: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
dcb0: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
dcc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
dcd0: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
dce0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
dcf0: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
dd00: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
dd10: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
dd20: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
dd30: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
dd40: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
dd50: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
dd60: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
dd70: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
dd80: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
dd90: 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20  if( pOrderBy || 
dda0: 70 2d 3e 75 73 65 73 56 69 72 74 20 29 7b 0a 20  p->usesVirt ){. 
ddb0: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
dde0: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
ddf0: 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
de00: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
de10: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
de20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
de30: 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
de40: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
de50: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
de60: 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
de70: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
de80: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
de90: 43 6f 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  Coll;.    CollSe
dea0: 71 20 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20  q **aCopy;..    
deb0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
dec0: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
ded0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
dee0: 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  eMalloc(sizeof(*
def0: 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 32  pKeyInfo)+nCol*2
df00: 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
df10: 29 20 2b 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 69  ) + nCol);.    i
df20: 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
df30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
df40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
df50: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
df60: 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _end;.    }..   
df70: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d   pKeyInfo->enc =
df80: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63   pParse->db->enc
df90: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
dfa0: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a  nField = nCol;..
dfb0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
dfc0: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
dfd0: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
dfe0: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
dff0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
e000: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
e010: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
e020: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
e030: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
e040: 61 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d  apColl = pParse-
e050: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
e060: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e070: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
e080: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
e090: 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
e0a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
e0b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
e0c0: 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
e0d0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 69 5d  >addrOpenVirt[i]
e0e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
e0f0: 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
e100: 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
e110: 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
e120: 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
e130: 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
e140: 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
e150: 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
e160: 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
e170: 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
e180: 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
e190: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
e1a0: 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d  >addrOpenVirt[1]
e1b0: 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
e1c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
e1d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e1e0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
e1f0: 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
e200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e210: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
e220: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
e230: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
e240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e250: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
e260: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
e270: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e280: 4f 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  OTerm = pOrderBy
e290: 2d 3e 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->a;.      int n
e2a0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
e2b0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
e2c0: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38  t addr;.      u8
e2d0: 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20   *pSortOrder;.. 
e2e0: 20 20 20 20 20 61 43 6f 70 79 20 3d 20 28 43 6f       aCopy = (Co
e2f0: 6c 6c 53 65 71 2a 2a 29 26 70 4b 65 79 49 6e 66  llSeq**)&pKeyInf
e300: 6f 5b 31 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72  o[1];.      pSor
e310: 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66  tOrder = pKeyInf
e320: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
e330: 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e 45 78 70  (u8*)&aCopy[nExp
e340: 72 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  r];.      memcpy
e350: 28 61 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f  (aCopy, pKeyInfo
e360: 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69  ->aColl, nCol*si
e370: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b  zeof(CollSeq*));
e380: 0a 20 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20  .      apColl = 
e390: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
e3a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e3b0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
e3c0: 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b 2b  r; i++, pOTerm++
e3d0: 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f 72  , apColl++, pSor
e3e0: 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20 20  tOrder++){.     
e3f0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
e400: 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a   pOTerm->pExpr;.
e410: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e420: 61 6d 65 20 3d 20 70 4f 54 65 72 6d 2d 3e 7a 4e  ame = pOTerm->zN
e430: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ame;.        ass
e440: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
e450: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
e460: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c  pr->iColumn<nCol
e470: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e480: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
e490: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 73 71 6c     *apColl = sql
e4a0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
e4b0: 71 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c  q(pParse, zName,
e4c0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   -1);.        }e
e4d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
e4e0: 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
e4f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
e500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e510: 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
e520: 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
e530: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
e540: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
e550: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
e560: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
e570: 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d 3e 3d 30  drOpenVirt[2]>=0
e580: 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
e590: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
e5a0: 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
e5b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
e5c0: 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73  , addr, p->pELis
e5d0: 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  t->nExpr+2);.   
e5e0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
e5f0: 65 6c 64 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  eld = pOrderBy->
e600: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
e610: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e620: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
e630: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
e640: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
e650: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
e660: 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61   0;.      genera
e670: 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
e680: 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  e, p, v, p->pELi
e690: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
e6a0: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a  , iParm);.    }.
e6b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e6c0: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
e6d0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e6e0: 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
e6f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e700: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
e710: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
e720: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e730: 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  IEW./*.** Scan t
e740: 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
e750: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
e760: 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
e770: 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
e780: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
e790: 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
e7a0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
e7b0: 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
e7c0: 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
e7d0: 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
e7e0: 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
e7f0: 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
e800: 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
e810: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
e820: 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
e830: 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
e840: 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
e850: 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
e860: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
e870: 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
e880: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
e890: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
e8a0: 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
e8b0: 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
e8c0: 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
e8d0: 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
e8e0: 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
e8f0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
e900: 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
e910: 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
e920: 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
e930: 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
e940: 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
e950: 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
e960: 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
e970: 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
e980: 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
e990: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
e9a0: 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
e9b0: 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
e9c0: 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f  prList*);  /* Fo
e9d0: 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
e9e0: 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
e9f0: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 2c 20  elect(Select *, 
ea00: 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
ea10: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
ea20: 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
ea30: 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72  d substExpr(Expr
ea40: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61   *pExpr, int iTa
ea50: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
ea60: 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45  EList){.  if( pE
ea70: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
ea80: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
ea90: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
eaa0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
eab0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
eac0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
ead0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
eae0: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
eaf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eb00: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
eb10: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
eb20: 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
eb30: 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
eb40: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
eb50: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
eb60: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
eb70: 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
eb80: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
eb90: 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69       pNew = pELi
eba0: 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
ebb0: 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
ebc0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
ebd0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
ebe0: 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
ebf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ec00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
ec10: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
ec20: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
ec30: 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
ec40: 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
ec50: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
ec60: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
ec70: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
ec80: 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
ec90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
eca0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ecb0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
ecc0: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d    pExpr->pList =
ecd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ece0: 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29  Dup(pNew->pList)
ecf0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
ed00: 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54  Table = pNew->iT
ed10: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70  able;.      pExp
ed20: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65  r->iColumn = pNe
ed30: 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  w->iColumn;.    
ed40: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
ed50: 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
ed60: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
ed70: 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  py(&pExpr->token
ed80: 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b  , &pNew->token);
ed90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
eda0: 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
edb0: 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
edc0: 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
edd0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
ede0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 4e 65 77  e3SelectDup(pNew
edf0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
ee00: 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d    pExpr->flags =
ee10: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20   pNew->flags;.  
ee20: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
ee30: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
ee40: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c  ->pLeft, iTable,
ee50: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
ee60: 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
ee70: 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
ee80: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
ee90: 74 53 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70  tSelect(pExpr->p
eea0: 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
eeb0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
eec0: 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
eed0: 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
eee0: 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
eef0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
ef00: 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
ef10: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
ef20: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
ef30: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
ef40: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
ef50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
ef60: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
ef70: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
ef80: 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74   substExpr(pList
ef90: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
efa0: 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
efb0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
efc0: 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c   substSelect(Sel
efd0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ect *p, int iTab
efe0: 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
eff0: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20  List){.  if( !p 
f000: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
f010: 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
f020: 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
f030: 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
f040: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
f050: 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
f060: 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
f070: 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
f080: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
f090: 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70 2d  ;.  substExpr(p-
f0a0: 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
f0b0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
f0c0: 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
f0d0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
f0e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
f0f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f100: 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
f110: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f120: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69  T_VIEW./*.** Thi
f130: 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
f140: 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
f150: 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
f160: 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
f170: 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
f180: 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
f190: 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
f1a0: 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
f1b0: 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
f1c0: 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
f1d0: 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
f1e0: 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
f1f0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
f200: 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
f210: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
f220: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
f230: 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
f240: 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
f250: 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
f260: 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
f270: 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
f280: 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
f290: 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
f2a0: 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
f2b0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
f2c0: 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
f2d0: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
f2e0: 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
f2f0: 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
f300: 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
f310: 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
f320: 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
f330: 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
f340: 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
f350: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f360: 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
f370: 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
f380: 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
f390: 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
f3a0: 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
f3b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f3c0: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
f3d0: 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
f3e0: 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
f3f0: 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
f400: 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
f410: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
f420: 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
f430: 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
f440: 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
f450: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
f460: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
f470: 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
f480: 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
f490: 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
f4a0: 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
f4b0: 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
f4c0: 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
f4d0: 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
f4e0: 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
f4f0: 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
f500: 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
f510: 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
f520: 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
f530: 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
f540: 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
f550: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
f560: 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
f570: 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
f580: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
f590: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
f5a0: 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
f5b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
f5c0: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f5d0: 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
f5e0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f5f0: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
f600: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
f610: 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
f620: 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
f630: 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
f640: 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
f650: 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
f660: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
f670: 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
f680: 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
f690: 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
f6a0: 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
f6b0: 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
f6c0: 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
f6d0: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
f6e0: 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
f6f0: 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
f700: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f710: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f720: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
f730: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
f740: 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
f750: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
f760: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
f770: 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
f780: 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
f790: 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
f7a0: 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
f7b0: 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
f7c0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
f7d0: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
f7e0: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
f7f0: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f800: 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
f810: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
f820: 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
f830: 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
f840: 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
f850: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
f860: 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
f870: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
f880: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f890: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
f8a0: 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
f8b0: 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
f8c0: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
f8d0: 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
f8e0: 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
f8f0: 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
f900: 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
f910: 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
f920: 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
f930: 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
f940: 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
f950: 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
f960: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
f970: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
f980: 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
f990: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
f9a0: 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
f9b0: 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  #350).**.** In t
f9c0: 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
f9d0: 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
f9e0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
f9f0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
fa00: 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
fa10: 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
fa20: 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
fa30: 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
fa40: 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
fa50: 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
fa60: 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
fa70: 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
fa80: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
fa90: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
faa0: 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
fab0: 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
fac0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
fad0: 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
fae0: 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
faf0: 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
fb00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
fb10: 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
fb20: 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
fb30: 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
fb40: 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
fb50: 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
fb60: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
fb70: 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
fb80: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
fb90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
fba0: 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
fbb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
fbc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
fbd0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fbe0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
fbf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
fc00: 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
fc10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
fc20: 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
fc30: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
fc40: 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
fc50: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
fc60: 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
fc70: 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
fc80: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
fc90: 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
fca0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
fcb0: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
fcc0: 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
fcd0: 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
fce0: 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
fcf0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
fd00: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
fd10: 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
fd20: 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
fd30: 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
fd40: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
fd50: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
fd60: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
fd70: 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
fd80: 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
fd90: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
fda0: 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
fdb0: 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
fdc0: 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
fdd0: 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
fde0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
fdf0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
fe00: 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
fe10: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
fe20: 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
fe30: 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
fe40: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe60: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fe70: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
fea0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
feb0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
fec0: 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
fed0: 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
fee0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
fef0: 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
ff00: 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
ff10: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
ff20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
ff30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
ff40: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
ff50: 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26   assert( pSrc &&
ff60: 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72   iFrom>=0 && iFr
ff70: 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  om<pSrc->nSrc );
ff80: 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70  .  pSubitem = &p
ff90: 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20  Src->a[iFrom];. 
ffa0: 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
ffb0: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
ffc0: 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
ffd0: 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
ffe0: 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
fff0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
10000 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
10010 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
10020 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62 53  eturn 0;.  pSubS
10030 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
10040 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
10050 72 63 20 29 3b 0a 20 20 69 66 28 20 28 70 53 75  rc );.  if( (pSu
10060 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
10070 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53 75 62 2d  pLimit) || pSub-
10080 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a 20 20 20  >pOffset || .   
10090 20 20 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69 74     (pSub->pLimit
100a0 20 26 26 20 69 73 41 67 67 29 20 29 20 72 65 74   && isAgg) ) ret
100b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
100c0 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
100d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
100e0 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74  pSub->isDistinct
100f0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
10100 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
10110 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10120 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73  }.  if( p->isDis
10130 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72  tinct && subquer
10140 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
10150 30 3b 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73  0;.  if( (p->dis
10160 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20  allowOrderBy || 
10170 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20  p->pOrderBy) && 
10180 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
10190 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
101a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
101b0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
101c0 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
101d0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
101e0 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
101f0 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
10200 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
10210 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
10220 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
10230 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
10240 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
10250 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
10260 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
10270 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
10280 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
10290 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
102a0 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
102b0 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
102c0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
102d0 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
102e0 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
102f0 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
10300 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  e thing..  */.  
10310 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
10320 63 3e 31 20 26 26 20 69 46 72 6f 6d 3e 30 20 26  c>1 && iFrom>0 &
10330 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  & (pSrc->a[iFrom
10340 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  -1].jointype & J
10350 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
10360 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10370 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
10380 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73  on 12:  If the s
10390 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
103a0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
103b0 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a  a left outer.  *
103c0 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  * join, make sur
103d0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  e the subquery h
103e0 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
103f0 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d  se..  ** An exam
10400 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
10410 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
10420 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
10430 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
10440 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20   JOIN (SELECT * 
10450 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32  FROM t2 WHERE t2
10460 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  .x>0).  **.  ** 
10470 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
10480 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
10490 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
104a0 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
104b0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
104c0 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a  WHERE t2.x>0.  *
104d0 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74  *.  ** But the t
104e0 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20  2.x>0 test will 
104f0 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61  always fail on a
10500 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c   NULL row of t2,
10510 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65   which.  ** effe
10520 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73  ctively converts
10530 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20   the OUTER JOIN 
10540 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f  into an INNER JO
10550 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  IN..  */.  if( i
10560 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d  From>0 && (pSrc-
10570 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e  >a[iFrom-1].join
10580 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
10590 21 3d 30 20 0a 20 20 20 20 20 20 26 26 20 70 53  !=0 .      && pS
105a0 75 62 2d 3e 70 57 68 65 72 65 21 3d 30 20 29 7b  ub->pWhere!=0 ){
105b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
105c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
105d0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
105e0 20 69 74 20 6d 65 61 6e 73 20 66 6c 61 74 74 65   it means flatte
105f0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
10600 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 69  d for the.  ** i
10610 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
10620 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
10630 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
10640 65 72 79 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ery..  */..  /* 
10650 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  Move all of the 
10660 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
10670 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
10680 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
10690 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
106a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
106b0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
106c0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
106d0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
106e0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
106f0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
10700 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
10710 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
10720 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
10730 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
10740 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
10750 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
10760 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
10770 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
10780 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
10790 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
107a0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
107b0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
107c0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
107d0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
107e0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
107f0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
10800 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
10810 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
10820 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
10830 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62    {.    int nSub
10840 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
10850 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
10860 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
10870 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 0a 20 20 20  ->jointype;..   
10880 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
10890 62 6c 65 28 30 2c 20 70 53 75 62 69 74 65 6d 2d  ble(0, pSubitem-
108a0 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
108b0 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
108c0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
108d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
108e0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
108f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
10900 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  bitem->zAlias);.
10910 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
10920 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  1 ){.      int e
10930 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d  xtra = nSubSrc -
10940 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   1;.      for(i=
10950 31 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  1; i<nSubSrc; i+
10960 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63  +){.        pSrc
10970 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
10980 74 41 70 70 65 6e 64 28 70 53 72 63 2c 20 30 2c  tAppend(pSrc, 0,
10990 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
109a0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
109b0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  c;.      for(i=p
109c0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2d 65  Src->nSrc-1; i-e
109d0 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20 69 2d 2d  xtra>=iFrom; i--
109e0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 72 63 2d  ){.        pSrc-
109f0 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  >a[i] = pSrc->a[
10a00 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20 20 20 20  i-extra];.      
10a10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
10a20 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
10a30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 72 63  i++){.      pSrc
10a40 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
10a50 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
10a60 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
10a70 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
10a80 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
10a90 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
10aa0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2b 6e 53  pSrc->a[iFrom+nS
10ab0 75 62 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ubSrc-1].jointyp
10ac0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
10ad0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  }..  /* Now begi
10ae0 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
10af0 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
10b00 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
10b10 6f 72 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  or .  ** referen
10b20 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
10b30 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
10b40 71 75 65 72 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a  query..  ** .  *
10b50 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
10b60 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
10b70 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
10b80 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
10b90 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
10ba0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 2a  ) WHERE a>b;.  *
10bb0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
10bc0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10bd0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
10be0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
10bf0 20 20 20 20 20 20 20 2f 0a 20 20 2a 2a 20 20 20         /.  **   
10c00 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
10c10 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
10c20 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
10c30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10c40 5f 5f 2f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  __/.  **.  ** We
10c50 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
10c60 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
10c70 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
10c80 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
10c90 73 65 65 0a 20 20 2a 2a 20 22 61 22 20 77 65 20  see.  ** "a" we 
10ca0 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
10cb0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
10cc0 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
10cd0 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
10ce0 2e 0a 20 20 2a 2f 0a 20 20 73 75 62 73 74 45 78  ..  */.  substEx
10cf0 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
10d00 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10d10 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4c 69 73  >pEList);.  pLis
10d20 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
10d30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
10d40 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
10d50 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
10d60 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
10d70 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26  a[i].zName==0 &&
10d80 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   (pExpr = pList-
10d90 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70  >a[i].pExpr)->sp
10da0 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  an.z!=0 ){.     
10db0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
10dc0 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  me = sqliteStrND
10dd0 75 70 28 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  up(pExpr->span.z
10de0 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
10df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10e00 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
10e10 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
10e20 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
10e30 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
10e40 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
10e50 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
10e60 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10e70 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
10e80 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
10e90 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
10ea0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
10eb0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10ec0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
10ed0 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
10ee0 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  By = 0;.  }else 
10ef0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
10f00 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
10f10 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
10f20 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
10f30 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
10f40 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
10f50 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
10f60 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10f70 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
10f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
10f90 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
10fa0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
10fb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10fc0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
10fd0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
10fe0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
10ff0 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
11000 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
11010 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
11020 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
11030 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  ist);.    p->pHa
11040 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
11050 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67  prAnd(p->pHaving
11060 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
11070 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29  (pSub->pHaving))
11080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
11090 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
110a0 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
110b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
110c0 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75  tDup(pSub->pGrou
110d0 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
110e0 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
110f0 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
11100 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
11110 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
11120 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
11130 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
11140 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
11150 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
11160 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
11170 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
11180 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
11190 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
111a0 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
111b0 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
111c0 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
111d0 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
111e0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45  ..  /*.  ** SELE
111f0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
11200 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
11210 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
11220 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2f  x OFFSET y;.  */
11230 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
11240 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  mit ){.    p->pL
11250 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
11260 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  mit;.    pSub->p
11270 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Limit = 0;.  }..
11280 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
11290 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
112a0 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
112b0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
112c0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
112d0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
112e0 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
112f0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
11300 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11310 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
11320 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
11330 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
11340 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
11350 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
11360 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
11370 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
11380 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
11390 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
113a0 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
113b0 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
113c0 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
113d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
113e0 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
113f0 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
11400 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
11410 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74  s SELECT and ret
11420 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
11430 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
11440 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
11450 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
11460 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
11470 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
11480 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
11490 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
114a0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
114b0 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
114c0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
114d0 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
114e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
114f0 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
11500 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
11510 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
11520 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
11530 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
11540 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
11550 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
11560 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
11570 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
11580 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
11590 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
115a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
115b0 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
115c0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
115d0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
115e0 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
115f0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
11600 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
11610 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
11620 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  for sqlite3Selec
11630 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  t()..** See the 
11640 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
11650 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
11660 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
11670 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
11680 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d  atic int simpleM
11690 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
116a0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
116b0 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
116c0 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78  int iParm){.  Ex
116d0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
116e0 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
116f0 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
11700 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
11710 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
11720 74 20 73 65 65 6b 4f 70 3b 0a 20 20 69 6e 74 20  t seekOp;.  int 
11730 63 6f 6e 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  cont;.  ExprList
11740 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73 74   *pEList, *pList
11750 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  , eList;.  struc
11760 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11770 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72 63  eListItem;.  Src
11780 4c 69 73 74 20 2a 70 53 72 63 3b 0a 0a 20 20 2f  List *pSrc;..  /
11790 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
117a0 66 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  f this query is 
117b0 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f  a simple min() o
117c0 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 20  r max() query.  
117d0 52 65 74 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f  Return.  ** zero
117e0 20 69 66 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a   if it is  not..
117f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47    */.  if( p->pG
11800 72 6f 75 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61  roupBy || p->pHa
11810 76 69 6e 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72  ving || p->pWher
11820 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  e ) return 0;.  
11830 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
11840 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
11850 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
11860 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
11870 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
11880 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
11890 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 78 70 72  eturn 0;.  pExpr
118a0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
118b0 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
118c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
118d0 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
118e0 20 30 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 45   0;.  pList = pE
118f0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66  xpr->pList;.  if
11900 28 20 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c  ( pList==0 || pL
11910 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
11920 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
11930 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
11940 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
11950 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
11960 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Cmp(pExpr->token
11970 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29  .z,"min",3)==0 )
11980 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f  {.    seekOp = O
11990 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73  P_Rewind;.  }els
119a0 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
119b0 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f 6b  NICmp(pExpr->tok
119c0 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30  en.z,"max",3)==0
119d0 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d   ){.    seekOp =
119e0 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73   OP_Last;.  }els
119f0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
11a00 0a 20 20 7d 0a 20 20 70 45 78 70 72 20 3d 20 70  .  }.  pExpr = p
11a10 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11a20 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
11a30 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
11a40 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 6f 6c 20  eturn 0;.  iCol 
11a50 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
11a60 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  ;.  pTab = pSrc-
11a70 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f  >a[0].pTab;..  /
11a80 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20 68  * If we get to h
11a90 65 72 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ere, it means th
11aa0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 74 68  e query is of th
11ab0 65 20 63 6f 72 72 65 63 74 20 66 6f 72 6d 2e 0a  e correct form..
11ac0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
11ad0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
11ae0 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 6b  an index and mak
11af0 65 20 70 49 64 78 20 70 6f 69 6e 74 20 74 6f 20  e pIdx point to 
11b00 74 68 65 0a 20 20 2a 2a 20 61 70 70 72 6f 70 72  the.  ** appropr
11b10 69 61 74 65 20 69 6e 64 65 78 2e 20 20 49 66 20  iate index.  If 
11b20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
11b30 28 29 20 69 73 20 6f 6e 20 61 6e 20 49 4e 54 45  () is on an INTE
11b40 47 45 52 20 50 52 49 4d 41 52 59 0a 20 20 2a 2a  GER PRIMARY.  **
11b50 20 6b 65 79 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20   key column, no 
11b60 69 6e 64 65 78 20 69 73 20 6e 65 63 65 73 73 61  index is necessa
11b70 72 79 20 73 6f 20 73 65 74 20 70 49 64 78 20 74  ry so set pIdx t
11b80 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20  o NULL.  If no. 
11b90 20 2a 2a 20 75 73 61 62 6c 65 20 69 6e 64 65 78   ** usable index
11ba0 20 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   is found, retur
11bb0 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
11bc0 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 70 49  iCol<0 ){.    pI
11bd0 64 78 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  dx = 0;.  }else{
11be0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
11bf0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
11c00 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
11c10 20 70 45 78 70 72 29 3b 0a 20 20 20 20 66 6f 72   pExpr);.    for
11c20 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11c30 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11c40 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11c50 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
11c60 3e 6e 43 6f 6c 75 6d 6e 3e 3d 31 20 29 3b 0a 20  >nColumn>=1 );. 
11c70 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
11c80 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
11c90 20 26 26 20 70 49 64 78 2d 3e 6b 65 79 49 6e 66   && pIdx->keyInf
11ca0 6f 2e 61 43 6f 6c 6c 5b 30 5d 3d 3d 70 43 6f 6c  o.aColl[0]==pCol
11cb0 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  l ) break;.    }
11cc0 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d 3d 30  .    if( pIdx==0
11cd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
11ce0 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
11cf0 63 6f 6c 75 6d 6e 20 74 79 70 65 73 20 69 66 20  column types if 
11d00 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
11d10 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 20 20   the callback.  
11d20 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
11d30 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
11d40 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
11d50 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 72 20 61   to a table or a
11d60 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 20 20   memory cell..  
11d70 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ** The column na
11d80 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
11d90 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 20   been generated 
11da0 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  in the calling f
11db0 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
11dc0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
11dd0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
11de0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
11df0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
11e00 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
11e10 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
11e20 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
11e30 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
11e40 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
11e50 5f 56 69 72 74 75 61 6c 54 61 62 20 29 7b 0a 20  _VirtualTab ){. 
11e60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11e70 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69  dOp(v, OP_OpenVi
11e80 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c 20 31 29  rtual, iParm, 1)
11e90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
11ea0 72 61 74 69 6e 67 20 63 6f 64 65 20 74 6f 20 66  rating code to f
11eb0 69 6e 64 20 74 68 65 20 6d 69 6e 20 6f 72 20 74  ind the min or t
11ec0 68 65 20 6d 61 78 2e 20 20 42 61 73 69 63 61 6c  he max.  Basical
11ed0 6c 79 20 61 6c 6c 20 77 65 20 68 61 76 65 0a 20  ly all we have. 
11ee0 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 66 69 6e   ** to do is fin
11ef0 64 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 74  d the first or t
11f00 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
11f10 20 74 68 65 20 63 68 6f 73 65 6e 20 69 6e 64 65   the chosen inde
11f20 78 2e 20 20 49 66 0a 20 20 2a 2a 20 74 68 65 20  x.  If.  ** the 
11f30 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
11f40 73 20 6f 6e 20 74 68 65 20 49 4e 54 45 47 45 52  s on the INTEGER
11f50 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
11f60 65 6e 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  en find the firs
11f70 74 0a 20 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65  t.  ** or last e
11f80 6e 74 72 79 20 69 6e 20 74 68 65 20 6d 61 69 6e  ntry in the main
11f90 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73   table..  */.  s
11fa0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
11fb0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
11fc0 54 61 62 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73  Tab->iDb);.  bas
11fd0 65 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  e = pSrc->a[0].i
11fe0 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74  Cursor;.  comput
11ff0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12000 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
12010 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ( pSrc->a[0].pSe
12020 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
12030 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 46  qlite3OpenTableF
12040 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 62 61 73  orReading(v, bas
12050 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20  e, pTab);.  }.  
12060 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
12070 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12080 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b    if( pIdx==0 ){
12090 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
120a0 41 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c  AddOp(v, seekOp,
120b0 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c   base, 0);.  }el
120c0 73 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20  se{.    /* Even 
120d0 74 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f  though the curso
120e0 72 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  r used to open t
120f0 68 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73  he index here is
12100 20 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61   closed.    ** a
12110 73 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67  s soon as a sing
12120 6c 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65  le value has bee
12130 6e 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20  n read from it, 
12140 61 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20  allocate it.    
12150 2a 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65  ** using (pParse
12160 2d 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65  ->nTab++) to pre
12170 76 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20  vent the cursor 
12180 69 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20  id from being . 
12190 20 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68     ** reused. Th
121a0 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
121b0 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  for statements o
121c0 66 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20  f the form .    
121d0 2a 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ** "INSERT INTO 
121e0 78 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46  x SELECT max() F
121f0 52 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20  ROM x"..    */. 
12200 20 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20     int iIdx;.   
12210 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
12220 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
12230 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12240 4f 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78  OP_Integer, pIdx
12250 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 73  ->iDb, 0);.    s
12260 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
12270 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
12280 64 78 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a  dx, pIdx->tnum,.
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 28 63 68 61 72 2a 29 26 70 49 64 78 2d     (char*)&pIdx-
122b0 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
122c0 49 4e 46 4f 29 3b 0a 20 20 20 20 69 66 28 20 73  INFO);.    if( s
122d0 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  eekOp==OP_Rewind
122e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
122f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12300 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
12310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12320 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
12330 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ecord, 1, 0);.  
12340 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
12350 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20  MoveGt;.    }.  
12360 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12370 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49  Op(v, seekOp, iI
12380 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
12390 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
123a0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
123b0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
123c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
123d0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
123e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
123f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
12400 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
12410 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
12420 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
12430 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
12440 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
12450 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
12460 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
12470 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
12480 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
12490 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
124a0 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
124b0 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
124c0 69 50 61 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e  iParm, cont, con
124d0 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
124e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
124f0 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
12500 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12510 20 4f 50 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c   OP_Close, base,
12520 20 30 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e   0);.  .  return
12530 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61   1;.}../*.** Ana
12540 6c 79 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42  lyze and ORDER B
12550 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
12560 61 75 73 65 20 69 6e 20 61 20 53 45 4c 45 43 54  ause in a SELECT
12570 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74   statement.  Ret
12580 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
12590 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
125a0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52  ..**.** An ORDER
125b0 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
125c0 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70  is a list of exp
125d0 72 65 73 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e  ressions.  If an
125e0 79 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  y expression.** 
125f0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
12600 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 61  nstant, then tha
12610 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
12620 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 0a  replaced by the.
12630 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
12640 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 65   entry in the re
12650 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
12660 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73 4f  tic int processO
12670 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
12680 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
12690 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
126a0 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
126b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  CT statement. */
126c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
126d0 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20  derBy,   /* The 
126e0 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
126f0 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62  P BY clause to b
12700 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
12710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
12720 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72  pe     /* Either
12730 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
12740 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69  UP", as appropri
12750 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
12760 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
12770 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
12780 69 73 74 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ist;     /* The 
12790 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
127a0 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61  e SELECT */.  Pa
127b0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
127c0 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f  C->pParse;     /
127d0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
127e0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 2a   of the SELECT *
127f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  /.  assert( pELi
12800 73 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72  st );..  if( pOr
12810 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
12820 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
12830 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
12840 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  r; i++){.    int
12850 20 69 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20   iCol;.    Expr 
12860 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
12870 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
12880 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
12890 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
128a0 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ol) ){.      if(
128b0 20 69 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c   iCol>0 && iCol<
128c0 3d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  =pEList->nExpr )
128d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
128e0 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b  3ExprDelete(pE);
128f0 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f  .        pE = pO
12900 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
12910 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
12920 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43  Dup(pEList->a[iC
12930 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  ol-1].pExpr);.  
12940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12950 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12960 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12970 20 20 20 20 20 20 20 22 25 73 20 42 59 20 63 6f         "%s BY co
12980 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f  lumn number %d o
12990 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
129a0 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20  ould be ".      
129b0 20 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20       "between 1 
129c0 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65 2c 20  and %d", zType, 
129d0 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
129e0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
129f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
12a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
12a10 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
12a20 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29  Names(pNC, pE) )
12a30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
12a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12a50 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
12a60 73 74 61 6e 74 28 70 45 29 20 29 7b 0a 20 20 20  stant(pE) ){.   
12a70 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12a80 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
12a90 20 20 20 20 20 22 25 73 20 42 59 20 74 65 72 6d       "%s BY term
12aa0 73 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f  s must not be no
12ab0 6e 2d 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n-integer consta
12ac0 6e 74 73 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  nts", zType);.  
12ad0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12ae0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12af0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12b00 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
12b10 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
12b20 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
12b30 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
12b40 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
12b50 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
12b60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12b70 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
12b80 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
12b90 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
12ba0 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
12bb0 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
12bc0 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
12bd0 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
12be0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
12bf0 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
12c00 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12c10 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
12c20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12c30 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12c40 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
12c50 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
12c60 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
12c70 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
12c80 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
12c90 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
12ca0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
12cb0 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
12cc0 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
12cd0 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
12ce0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d00 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
12d10 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
12d20 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
12d30 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
12d40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
12d50 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
12d60 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
12d70 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
12d80 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
12d90 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
12da0 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
12db0 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
12dc0 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
12dd0 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
12de0 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
12df0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
12e00 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
12e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12e20 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
12e30 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
12e40 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
12e50 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
12e60 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
12e70 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
12e80 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
12e90 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
12ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
12eb0 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
12ec0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
12ed0 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
12ee0 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
12ef0 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
12f00 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
12f10 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
12f20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
12f30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
12f40 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
12f50 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
12f60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12f70 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
12f80 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
12f90 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
12fa0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
12fb0 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
12fc0 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
12fd0 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
12fe0 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
12ff0 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
13000 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  ntext..  */.  sN
13010 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
13020 65 3b 0a 20 20 73 4e 43 2e 68 61 73 41 67 67 20  e;.  sNC.hasAgg 
13030 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 45 72 72 20  = 0;.  sNC.nErr 
13040 3d 20 30 3b 0a 20 20 73 4e 43 2e 6e 52 65 66 20  = 0;.  sNC.nRef 
13050 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73  = 0;.  sNC.pELis
13060 74 20 3d 20 30 3b 0a 20 20 73 4e 43 2e 61 6c 6c  t = 0;.  sNC.all
13070 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43  owAgg = 0;.  sNC
13080 2e 70 53 72 63 4c 69 73 74 20 3d 20 30 3b 0a 20  .pSrcList = 0;. 
13090 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
130a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
130b0 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
130c0 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c  NC, p->pLimit) |
130d0 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  |.      sqlite3E
130e0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
130f0 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74  &sNC, p->pOffset
13100 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13110 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13120 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  }..  /* Set up t
13130 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  he local name-co
13140 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f  ntext to pass to
13150 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65   ExprResolveName
13160 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f  s() to.  ** reso
13170 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
13180 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  on-list..  */.  
13190 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  sNC.allowAgg = 1
131a0 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
131b0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e   = p->pSrc;.  sN
131c0 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72  C.pNext = pOuter
131d0 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  NC;..  /* Resolv
131e0 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72  e names in the r
131f0 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
13200 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
13210 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73  st;.  if( !pELis
13220 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
13230 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69  E_ERROR;.  for(i
13240 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
13250 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
13260 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74  xpr *pX = pEList
13270 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
13280 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
13290 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
132a0 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20  NC, pX) ){.     
132b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
132c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
132d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
132e0 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  re no aggregate 
132f0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  functions in the
13300 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64   result-set, and
13310 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20   no GROUP BY .  
13320 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64  ** expression, d
13330 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72  o not allow aggr
13340 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66  egates in any of
13350 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
13360 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ssions..  */.  a
13370 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67  ssert( !p->isAgg
13380 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d   );.  pGroupBy =
13390 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
133a0 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20  if( pGroupBy || 
133b0 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20  sNC.hasAgg ){.  
133c0 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a    p->isAgg = 1;.
133d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43    }else{.    sNC
133e0 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20  .allowAgg = 0;. 
133f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41   }..  /* If a HA
13400 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
13410 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
13420 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f  re must be a GRO
13430 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
13440 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76  */.  if( p->pHav
13450 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
13460 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13470 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13480 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
13490 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
134a0 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
134b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
134c0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
134d0 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65  /* Add the expre
134e0 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68  ssion list to th
134f0 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62  e name-context b
13500 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68  efore parsing th
13510 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70  e.  ** other exp
13520 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
13530 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13540 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  . This is so tha
13550 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  t.  ** expressio
13560 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
13570 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61  clause (etc.) ca
13580 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65  n refer to expre
13590 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61  ssions by.  ** a
135a0 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
135b0 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20  sult set..  **. 
135c0 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a   ** Minor point:
135d0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
135e0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65  case, then the e
135f0 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  xpression will b
13600 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61  e.  ** re-evalua
13610 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66  ted for each ref
13620 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20  erence to it..  
13630 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  */.  sNC.pEList 
13640 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
13650 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
13660 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
13670 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20   p->pWhere) ||. 
13680 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13690 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
136a0 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c  C, p->pHaving) |
136b0 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
136c0 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
136d0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
136e0 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20  ORDER") ||.     
136f0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
13700 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75  upBy(&sNC, pGrou
13710 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20 20  pBy, "GROUP").  
13720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13730 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
13740 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13750 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
13760 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
13770 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
13780 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
13790 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
137a0 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
137b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
137c0 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30  ;.  .    for(i=0
137d0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
137e0 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
137f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
13800 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
13810 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
13820 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45  (pItem->pExpr, E
13830 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
13840 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13850 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65  g(pParse, "aggre
13860 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
13870 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
13880 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
13890 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
138a0 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
138b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
138c0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
138d0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
138e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
138f0 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
13900 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
13910 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
13920 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
13930 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
13940 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
13950 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
13960 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
13970 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
13980 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
13990 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
139a0 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
139b0 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
139c0 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
139d0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
139e0 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
139f0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
13a00 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
13a10 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
13a20 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
13a30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
13a40 20 61 64 64 72 3b 0a 20 20 73 74 72 75 63 74 20   addr;.  struct 
13a50 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
13a60 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49  unc;.  if( pAggI
13a70 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49  nfo->nFunc+pAggI
13a80 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20  nfo->nColumn==0 
13a90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
13aa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13ab0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c  AddOp(v, OP_Null
13ac0 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  , 0, 0);.  for(i
13ad0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
13ae0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
13af0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13b00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13b10 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 41 67 67 49  _MemStore, pAggI
13b20 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
13b30 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
13b40 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
13b50 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
13b60 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
13b70 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
13b80 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13b90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13ba0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 46 75 6e 63  _MemStore, pFunc
13bb0 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
13bc0 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
13bd0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
13be0 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
13bf0 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
13c00 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30  if( pE->pList==0
13c10 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e   || pE->pList->n
13c20 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
13c30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13c40 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
13c50 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74  INCT in aggregat
13c60 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77  e must be follow
13c70 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ed ".           
13c80 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f  "by an expressio
13c90 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  n");.        pFu
13ca0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
13cb0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
13cc0 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
13cd0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
13ce0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
13cf0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69  (pParse, pE->pLi
13d00 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  st);.        sql
13d10 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
13d20 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
13d30 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
13d40 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13d60 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
13d70 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
13d80 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
13d90 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13da0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
13db0 61 64 64 72 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a  addr, 1);.}../*.
13dc0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
13dd0 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
13de0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
13df0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
13e00 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
13e10 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
13e20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
13e30 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
13e40 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
13e50 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
13e60 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
13e70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
13e80 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
13e90 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
13ea0 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
13eb0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
13ec0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
13ed0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
13ee0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
13ef0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
13f00 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71  r->pList;.    sq
13f10 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
13f20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
13f30 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
13f40 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
13f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f60 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
13f70 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
13f80 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
13f90 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
13fa0 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
13fb0 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
13fc0 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
13fd0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
13fe0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
13ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14000 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
14010 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
14020 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
14030 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
14040 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
14050 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
14060 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
14070 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
14080 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
14090 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
140a0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
140b0 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
140c0 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
140d0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
140e0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
140f0 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
14100 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
14110 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
14120 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
14130 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
14140 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
14150 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
14160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14170 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
14180 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
14190 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
141a0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
141b0 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
141c0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
141d0 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
141e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
141f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
14200 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
14210 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
14220 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  t(v, pF->iDistin
14230 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
14240 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   2);.    }.    i
14250 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65  f( pF->pFunc->ne
14260 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
14270 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
14280 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
14290 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
142a0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
142b0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
142c0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
142d0 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
142e0 6a 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  j<pList->nExpr; 
142f0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
14300 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
14310 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
14320 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
14330 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
14340 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
14350 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
14360 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
14370 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
14380 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14390 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
143a0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
143b0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
143c0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
143d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
143e0 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p3(v, OP_AggStep
143f0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72 67  , pF->iMem, nArg
14400 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75  , (void*)pF->pFu
14410 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b  nc, P3_FUNCDEF);
14420 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
14430 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
14440 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
14450 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
14460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
14470 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
14480 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
14490 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
144a0 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
144b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
144c0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
144d0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
144e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
144f0 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d 3e  P_MemStore, pC->
14500 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  iMem, 1);.  }.  
14510 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
14520 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  Mode = 0;.}.../*
14530 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14540 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
14550 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
14570 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
14580 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
14590 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
145a0 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
145b0 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72 6d   eDest and iParm
145c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65 73  ..**.**     eDes
145d0 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52 65  t Value       Re
145e0 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d  sult.**     ----
145f0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14620 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53  -------.**     S
14630 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20 49  RT_Callback    I
14640 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62 61  nvoke the callba
14650 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  ck for each row 
14660 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  of the result..*
14670 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d  *.**     SRT_Mem
14680 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 66           Store f
14690 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20 6d  irst result in m
146a0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72 6d  emory cell iParm
146b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
146c0 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72 65  et         Store
146d0 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79 73   results as keys
146e0 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   of table iParm.
146f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
14700 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
14710 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
14720 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
14730 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
14740 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70  **     SRT_Excep
14750 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65  t      Remove re
14760 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74  sults from the t
14770 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
14780 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
14790 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
147a0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
147b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
147c0 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68 65   iParm.**.** The
147d0 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73 20   table above is 
147e0 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64 64  incomplete.  Add
147f0 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76 61  itional eDist va
14800 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64 65  lue have be adde
14810 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73 20  d.** since this 
14820 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69 74  comment was writ
14830 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73 65  ten.  See the se
14840 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
14850 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  function for.** 
14860 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74 69  a complete listi
14870 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77 65  ng of the allowe
14880 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65 73  d values of eDes
14890 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61 6e  t and their mean
148a0 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ings..**.** This
148b0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
148c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
148d0 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65  rrors.  If any e
148e0 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63  rrors are.** enc
148f0 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61  ountered, then a
14900 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
14910 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
14920 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  eft in.** pParse
14930 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a  ->zErrMsg..**.**
14940 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
14950 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20  es NOT free the 
14960 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
14970 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65   passed in.  The
14980 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  .** calling func
14990 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f  tion needs to do
149a0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   that..**.** The
149b0 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74   pParent, parent
149c0 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65 6e  Tab, and *pParen
149d0 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65 20  tAgg fields are 
149e0 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68 69  filled in if thi
149f0 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20 61  s.** SELECT is a
14a00 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
14a10 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72 79   routine may try
14a20 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69 73   to combine this
14a30 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
14a40 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66 6f  its parent to fo
14a50 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  rm a single flat
14a60 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20 64   query.  In so d
14a70 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a 2a  oing, it might.*
14a80 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 72  * change the par
14a90 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20 61  ent query from a
14aa0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 74   non-aggregate t
14ab0 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  o an aggregate q
14ac0 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68 61  uery..** For tha
14ad0 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70 50  t reason, the pP
14ae0 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69 73  arentAgg flag is
14af0 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f 69   passed as a poi
14b00 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20 63  nter, so it.** c
14b10 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  an be changed..*
14b20 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
14b30 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
14b40 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61 72   the pParent par
14b50 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ameter..**.**   
14b60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14b70 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 78  1 JOIN (SELECT x
14b80 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
14b90 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a 20  t2) JOIN t3;.** 
14ba0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
14bb0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
14bc0 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
14bd0 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a 2a  ___/        /.**
14be0 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20       \          
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
14c20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
14c30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
14c40 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
14c50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a  ___________/.**.
14c60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14c70 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
14c80 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66 69  e outer query fi
14c90 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74 20  rst.   For that 
14ca0 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e 74  call,.** pParent
14cb0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20 20   will be NULL.  
14cc0 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63 65  During the proce
14cd0 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75 74  ssing of the out
14ce0 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20 0a  er query, this .
14cf0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
14d00 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
14d10 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 73   to handle the s
14d20 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74 68  ubquery.  For th
14d30 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 63  e recursive.** c
14d40 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69 6c  all, pParent wil
14d50 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6f  l point to the o
14d60 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 63  uter query.  Bec
14d70 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65 72  ause the subquer
14d80 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63 6f  y is.** the seco
14d90 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61 20  nd element in a 
14da0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c 20  three-way join, 
14db0 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70 61  the parentTab pa
14dc0 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a 20  rameter will.** 
14dd0 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76 61  be 1 (the 2nd va
14de0 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65 78  lue of a 0-index
14df0 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69 6e  ed array.).*/.in
14e00 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
14e10 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14e20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
14e30 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
14e40 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14e60 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14e70 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
14e80 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
14e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ea0 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
14eb0 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
14ec0 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20  .  int iParm,   
14ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70            /* A p
14ee0 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62 79  arameter used by
14ef0 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70 6f   the eDest dispo
14f00 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  sal method */.  
14f10 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 2c  Select *pParent,
14f20 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
14f30 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68 69  r SELECT for whi
14f40 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75 62  ch this is a sub
14f50 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  -query */.  int 
14f60 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20 20  parentTab,      
14f70 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
14f80 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66 20  Parent->pSrc of 
14f90 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
14fa0 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67 2c  int *pParentAgg,
14fb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14fc0 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20 61  f pParent uses a
14fd0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
14fe0 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66  ns */.  char *af
14ff0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f              /
15000 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
15010 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
15020 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
15030 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
15040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15050 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
15060 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
15070 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
15080 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
15090 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
150a0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
150b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
150c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
150d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
150e0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
150f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15100 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
15110 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
15120 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
15130 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
15140 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
15150 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
15160 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
15170 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
15180 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
15190 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
151a0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
151b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
151c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
151d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
151e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
151f0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
15200 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
15210 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
15220 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
15230 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
15240 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
15250 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
15260 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
15270 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
15280 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
15290 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
152a0 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  .  int isDistinc
152b0 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
152c0 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
152d0 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
152e0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69  sent */.  int di
152f0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
15300 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65   /* Table to use
15310 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
15320 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72  t set */.  int r
15330 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  c = 1;          
15340 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
15350 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66  turn from this f
15360 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  unction */.  int
15370 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20   addrSortIndex; 
15380 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
15390 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74  f an OP_OpenVirt
153a0 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ual instruction 
153b0 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
153c0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
153d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
153e0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
153f0 72 69 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 73  ries */..  if( s
15400 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
15410 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
15420 6e 45 72 72 20 7c 7c 20 70 3d 3d 30 20 29 20 72  nErr || p==0 ) r
15430 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
15440 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15450 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
15460 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
15470 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
15480 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
15490 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
154a0 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  fo));..#ifndef S
154b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
154c0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
154d0 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
154e0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
154f0 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
15500 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
15510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15520 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
15530 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
15540 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
15550 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  ct *pLoop;.     
15560 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
15570 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
15580 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
15590 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
155a0 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
155b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
155c0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70  rn multiSelect(p
155d0 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c  Parse, p, eDest,
155e0 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a 20 20   iParm, aff);.  
155f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f 72 64  }.#endif..  pOrd
15600 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
15610 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  By;.  if( Ignora
15620 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
15630 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ) ){.    p->pOrd
15640 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  erBy = 0;.  }.  
15650 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
15660 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
15670 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f   p, 0) ){.    go
15680 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
15690 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79   }.  p->pOrderBy
156a0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20   = pOrderBy;..  
156b0 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
156c0 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
156d0 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
156e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
156f0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
15700 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
15710 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
15720 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
15730 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
15740 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67  >pHaving;.  isAg
15750 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
15760 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
15770 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45  isDistinct;.  pE
15780 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
15790 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
157a0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
157b0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
157c0 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
157d0 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
157e0 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
157f0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
15800 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
15810 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
15820 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
15830 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
15840 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
15850 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
15860 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
15870 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
15880 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
15890 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
158a0 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
158b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 44   */.  assert( eD
158c0 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
158d0 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  || pEList->nExpr
158e0 3d 3d 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==1 );.#ifndef S
158f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15900 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74  ERY.  if( (eDest
15910 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
15920 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
15930 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
15940 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15950 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15960 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
15970 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
15980 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
15990 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
159a0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
159b0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
159c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
159d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
159e0 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
159f0 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
15a00 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
15a10 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
15a20 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
15a30 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
15a40 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
15a50 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
15a60 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
15a70 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
15a80 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
15a90 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15aa0 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
15ab0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
15ac0 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
15ad0 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
15ae0 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
15af0 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
15b00 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
15b10 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
15b20 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
15b30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
15b40 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
15b50 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
15b60 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
15b70 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
15b80 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
15b90 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
15ba0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
15bb0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
15bc0 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
15bd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15be0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
15bf0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15c00 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
15c10 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
15c20 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
15c30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15c40 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
15c50 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  = 0;.    int nee
15c60 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b  dRestoreContext;
15c70 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
15c80 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
15c90 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
15ca0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65  ];..    if( pIte
15cb0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
15cc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
15cd0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
15ce0 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
15cf0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
15d00 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
15d10 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
15d20 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
15d30 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
15d40 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
15d50 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
15d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
15d70 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
15d80 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
15d90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15da0 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
15db0 65 6c 65 63 74 2c 20 53 52 54 5f 56 69 72 74 75  elect, SRT_Virtu
15dc0 61 6c 54 61 62 2c 20 0a 20 20 20 20 20 20 20 20  alTab, .        
15dd0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
15de0 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26  iCursor, p, i, &
15df0 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 69  isAgg, 0);.    i
15e00 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  f( needRestoreCo
15e10 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  ntext ){.      p
15e20 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
15e30 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
15e40 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20  Context;.    }. 
15e50 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
15e60 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68 65 72  >pSrc;.    pWher
15e70 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
15e80 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
15e90 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29 20  eOrderby(eDest) 
15ea0 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
15eb0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
15ec0 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
15ed0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
15ee0 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
15ef0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
15f00 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
15f10 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
15f20 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
15f30 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
15f40 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
15f50 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
15f60 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
15f70 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
15f80 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
15f90 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
15fa0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
15fb0 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
15fc0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
15fd0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
15ff0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
16000 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
16010 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
16020 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
16030 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
16040 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
16050 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
16060 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
16070 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
16080 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16090 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
160a0 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
160b0 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
160c0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
160d0 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
160e0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
160f0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
16100 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
16110 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
16120 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
16130 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
16140 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
16150 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
16160 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
16170 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
16180 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
16190 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
161a0 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
161b0 65 63 69 66 69 65 64 20 61 6e 64 20 63 72 65 61  ecified and crea
161c0 74 65 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  te a sorting ind
161d0 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ex..  **.  ** Th
161e0 69 73 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  is sorting index
161f0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
16200 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
16210 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
16220 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
16230 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
16240 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
16250 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
16260 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 56 69  e.  ** OP_OpenVi
16270 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  rtual instructio
16280 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  n will be change
16290 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20  d to an OP_Noop 
162a0 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67  once.  ** we fig
162b0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
162c0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
162d0 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54  s not needed.  T
162e0 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  he addrSortIndex
162f0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69  .  ** variable i
16300 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
16310 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65  tate that change
16320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
16330 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 74 72  derBy ){.    str
16340 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16350 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 4b 65  m *pTerm;.    Ke
16360 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16370 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 54  .    for(i=0, pT
16380 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  erm=pOrderBy->a;
16390 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
163a0 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  pr; i++, pTerm++
163b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
163c0 72 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  rm->zName ){.   
163d0 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 45 78 70       pTerm->pExp
163e0 72 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  r->pColl = sqlit
163f0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
16400 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 7a  pParse, pTerm->z
16410 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Name, -1);.     
16420 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
16430 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
16440 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
16450 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
16460 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
16470 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
16480 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
16490 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  y);.    pOrderBy
164a0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
164b0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
164c0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
164d0 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
164e0 64 65 78 20 3d 0a 20 20 20 20 20 20 20 73 71 6c  dex =.       sql
164f0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
16500 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70  P_OpenVirtual, p
16510 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
16520 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
16530 70 72 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20  pr+2, .         
16540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16550 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
16560 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
16570 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
16580 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
16590 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
165a0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
165b0 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
165c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
165d0 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
165e0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
165f0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
16600 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
16610 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
16620 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
16630 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54  st==SRT_VirtualT
16640 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
16650 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16660 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50  _OpenVirtual, iP
16670 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
16680 70 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  pr);.  }...  /* 
16690 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  Initialize the m
166a0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55  emory cell to NU
166b0 4c 4c 20 66 6f 72 20 53 52 54 5f 4d 65 6d 20 6f  LL for SRT_Mem o
166c0 72 20 30 20 66 6f 72 20 53 52 54 5f 45 78 69 73  r 0 for SRT_Exis
166d0 74 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  ts.  */.  if( eD
166e0 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
166f0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
16700 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
16710 56 64 62 65 41 64 64 4f 70 28 76 2c 20 65 44 65  VdbeAddOp(v, eDe
16720 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 3f 20 4f 50  st==SRT_Mem ? OP
16730 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 49 6e 74 65 67  _Null : OP_Integ
16740 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
16750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16760 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
16770 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
16780 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
16790 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
167a0 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
167b0 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
167c0 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
167d0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
167e0 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69  yInfo;.    disti
167f0 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
16800 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
16810 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
16820 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
16830 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
16840 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
16850 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
16860 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
16870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16880 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
16890 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
168a0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
168b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
168c0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
168d0 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
168e0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
168f0 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
16900 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
16910 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
16920 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
16930 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
16940 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
16950 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
16960 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
16970 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
16980 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
16990 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
169a0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
169b0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
169c0 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  &pOrderBy);.    
169d0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
169e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
169f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
16a00 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
16a10 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
16a20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 56 69 72  prior OP_OpenVir
16a30 74 75 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  tual .    ** ins
16a40 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
16a50 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
16a60 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
16a70 74 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  the OP_OpenVirtu
16a80 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
16a90 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
16aa0 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
16ab0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
16ac0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
16ad0 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72 74 69     uncreateSorti
16ae0 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
16af0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
16b00 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
16b10 6e 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nVirt[2] = -1;. 
16b20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
16b30 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
16b40 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a  ner loop.    */.
16b50 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e      if( selectIn
16b60 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
16b70 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
16b80 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69   pOrderBy, disti
16b90 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20  nct, eDest,.    
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bb0 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f 2d 3e 69  iParm, pWInfo->i
16bc0 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
16bd0 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66 29 20 29  ->iBreak, aff) )
16be0 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  {.       goto se
16bf0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16c00 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
16c10 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
16c20 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
16c30 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
16c40 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
16c50 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
16c60 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
16c70 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
16c80 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
16c90 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
16ca0 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
16cb0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
16cc0 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
16cd0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
16ce0 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
16cf0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
16d00 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
16d10 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
16d20 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
16d30 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
16d40 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
16d50 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
16d60 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
16d70 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
16d80 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
16d90 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
16da0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
16db0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
16de0 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
16df0 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
16e00 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
16e10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
16e20 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
16e30 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
16e40 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
16e50 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
16e60 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
16e70 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
16e80 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
16e90 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
16ea0 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
16eb0 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
16ec0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
16ed0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
16ee0 20 68 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20   hold addresses 
16ef0 6f 72 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61  or labels for pa
16f00 72 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  rts of the.    *
16f10 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
16f20 65 20 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65  e program we are
16f30 20 70 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65   putting togethe
16f40 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
16f50 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20  rOutputRow;     
16f60 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62   /* Start of sub
16f70 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
16f80 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f  puts a result ro
16f90 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  w */.    int add
16fa0 72 53 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20  rSetAbort;      
16fb0 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
16fc0 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
16fd0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  n */.    int add
16fe0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b  rInitializeLoop;
16ff0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64   /* Start of cod
17000 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a  e that initializ
17010 65 73 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  es the input loo
17020 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
17030 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20  rTopOfLoop;     
17040 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
17050 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
17060 20 69 6e 74 20 61 64 64 72 47 72 6f 75 70 42 79   int addrGroupBy
17070 43 68 61 6e 67 65 3b 20 20 2f 2a 20 43 6f 64 65  Change;  /* Code
17080 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 20   that runs when 
17090 61 6e 79 20 47 52 4f 55 50 20 42 59 20 74 65 72  any GROUP BY ter
170a0 6d 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 20  m changes */.   
170b0 20 69 6e 74 20 61 64 64 72 50 72 6f 63 65 73 73   int addrProcess
170c0 52 6f 77 3b 20 20 20 20 20 2f 2a 20 43 6f 64 65  Row;     /* Code
170d0 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
170e0 6e 67 6c 65 20 69 6e 70 75 74 20 72 6f 77 20 2a  ngle input row *
170f0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
17100 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
17110 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72 6f 63   End of all proc
17120 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  essing */.    in
17130 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
17140 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  ;     /* The OP_
17150 4f 70 65 6e 56 69 72 74 75 61 6c 20 66 6f 72 20  OpenVirtual for 
17160 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
17170 78 20 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e  x */..    addrEn
17180 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
17190 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
171a0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f    /* Convert TK_
171b0 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74  COLUMN nodes int
171c0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  o TK_AGG_COLUMN 
171d0 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73  and make entries
171e0 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49   in.    ** sAggI
171f0 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41  nfo for all TK_A
17200 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65  GG_FUNCTION node
17210 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
17220 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53   of the.    ** S
17230 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
17240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  .    */.    mems
17250 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
17260 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e  of(sNC));.    sN
17270 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
17280 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  e;.    sNC.pSrcL
17290 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
172a0 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f      sNC.pAggInfo
172b0 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20   = &sAggInfo;.  
172c0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
172d0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
172e0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
172f0 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20  >nExpr+1 : 0;.  
17300 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
17310 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
17320 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
17330 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
17340 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 20  t(&sNC, pEList) 
17350 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
17360 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
17370 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
17380 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
17390 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
173a0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
173b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
173c0 7d 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  }.    if( pHavin
173d0 67 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  g && sqlite3Expr
173e0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
173f0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
17400 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
17410 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
17420 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
17430 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
17440 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
17450 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
17460 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
17470 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
17480 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
17490 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
174a0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
174b0 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
174c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
174d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
174e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
174f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
17500 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
17510 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
17520 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
17530 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
17540 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
17550 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
17560 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
17570 63 6f 6d 70 6c 65 78 20 74 68 61 20 61 67 67 72  complex tha aggr
17580 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
17590 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
175a0 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
175b0 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
175c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
175d0 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
175e0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
175f0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
17600 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  ..      /* Creat
17610 65 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65  e labels that we
17620 20 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67   will be needing
17630 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 0a  .      */.     .
17640 20 20 20 20 20 20 61 64 64 72 49 6e 69 74 69 61        addrInitia
17650 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  lizeLoop = sqlit
17660 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17670 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 47 72  v);.      addrGr
17680 6f 75 70 42 79 43 68 61 6e 67 65 20 3d 20 73 71  oupByChange = sq
17690 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
176a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  el(v);.      add
176b0 72 50 72 6f 63 65 73 73 52 6f 77 20 3d 20 73 71  rProcessRow = sq
176c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
176d0 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  el(v);..      /*
176e0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
176f0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
17700 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
17710 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
17720 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
17730 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
17740 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
17750 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
17760 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
17770 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
17780 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
17790 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 56 69 72  all, the OpenVir
177a0 74 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  tual instruction
177b0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
177c0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
177d0 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
177e0 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
177f0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
17800 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
17810 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
17820 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
17830 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
17840 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
17850 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 0a 20  drSortingIdx =. 
17860 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17870 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
17880 65 6e 56 69 72 74 75 61 6c 2c 20 73 41 67 67 49  enVirtual, sAggI
17890 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a  nfo.sortingIdx,.
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
178c0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
178d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
178e0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
178f0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
17900 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
17910 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
17920 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
17930 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
17940 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
17950 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
17960 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
17970 46 6c 61 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Flag = pParse->n
17980 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 41 62  Mem++;.      iAb
17990 6f 72 74 46 6c 61 67 20 3d 20 70 50 61 72 73 65  ortFlag = pParse
179a0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
179b0 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
179c0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72  nMem;.      pPar
179d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
179e0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
179f0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
17a00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
17a10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
17a20 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
17a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a40 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
17a50 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
17a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17a70 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
17a80 72 65 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  re, iAbortFlag, 
17a90 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
17aa0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
17ab0 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 55 73 65 46  _MemStore, iUseF
17ac0 6c 61 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  lag, 1);.      s
17ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
17ae0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
17af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17b00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
17b10 4d 65 6d 53 74 6f 72 65 2c 20 69 41 4d 65 6d 2c  MemStore, iAMem,
17b20 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
17b30 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
17b40 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
17b50 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
17b60 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
17b70 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
17b80 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
17b90 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
17ba0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
17bb0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
17bc0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
17bd0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
17be0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
17bf0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
17c00 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
17c10 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
17c20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17c30 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
17c40 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
17c50 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
17c60 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
17c70 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
17c80 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
17c90 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
17ca0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
17cb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
17cc0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
17cd0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
17ce0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
17cf0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
17d00 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
17d10 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17d20 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
17d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17d40 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72  Op(v, OP_MemIncr
17d50 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 30 29  , iAbortFlag, 0)
17d60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17d70 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
17d80 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
17d90 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
17da0 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  w = sqlite3VdbeC
17db0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17dd0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
17de0 6d 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  mPos, iUseFlag, 
17df0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
17e00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17e10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
17e20 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  eturn, 0, 0);.  
17e30 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
17e40 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
17e50 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
17e60 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
17e70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17e80 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
17e90 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
17ea0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31  drOutputRow+1, 1
17eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17ec0 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
17ed0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
17ee0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
17ef0 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
17f20 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f             addrO
17f50 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72  utputRow+1, addr
17f60 53 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a  SetAbort, aff);.
17f70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17f80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
17f90 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
17fa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17fb0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
17fc0 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  turn, 0, 0);..  
17fd0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
17fe0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
17ff0 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
18000 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
18010 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
18020 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
18030 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
18040 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
18050 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
18060 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
18070 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
18080 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
18090 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
180a0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
180b0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
180c0 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
180d0 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
180e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
180f0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18100 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69  Label(v, addrIni
18110 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20  tializeLoop);.  
18120 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
18130 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
18140 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
18150 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
18160 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  By);.      if( p
18170 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
18180 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
18190 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
181a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
181b0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
181c0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
181d0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
181e0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
181f0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
18200 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
18210 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  he OP_OpenVirtua
18220 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a  l table will be.
18230 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65          ** cance
18240 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75  lled later becau
18250 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  se we still need
18260 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79   to use the pKey
18270 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a  Info.        */.
18280 20 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79          pGroupBy
18290 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
182a0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
182b0 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ort = 0;.      }
182c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
182d0 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67   Rows are coming
182e0 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d   out in undeterm
182f0 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20  ined order.  We 
18300 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20  have to push.   
18310 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77       ** each row
18320 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20   into a sorting 
18330 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65  index, terminate
18340 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c   the first loop,
18350 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
18360 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73   loop over the s
18370 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20  orting index in 
18380 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
18390 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20   output.        
183a0 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ** in sorted ord
183b0 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  er.        */.  
183c0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
183d0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  t = 1;.        s
183e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
183f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
18400 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
18410 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18420 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  Op(v, OP_Sequenc
18430 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
18440 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20  ingIdx, 0);.    
18450 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70 42 79      j = pGroupBy
18460 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 20  ->nExpr+1;.     
18470 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
18480 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
18490 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
184a0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
184b0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
184c0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
184d0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
184e0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
184f0 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  j ) continue;.  
18500 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
18510 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
18520 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
18530 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18540 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d 3e 69  P_Rowid, pCol->i
18550 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
18560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18580 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
18590 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
185a0 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  ble, pCol->iColu
185b0 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mn);.          }
185c0 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
185d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
185e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
185f0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
18600 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20 20  ord, j, 0);.    
18610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18620 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
18630 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  sert, sAggInfo.s
18640 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
18650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
18660 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
18670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18680 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
18690 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
186a0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
186b0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  d);.        sAgg
186c0 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
186d0 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dx = 1;.      }.
186e0 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
186f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
18700 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
18710 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
18720 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
18730 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
18740 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
18750 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
18760 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
18770 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
18780 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
18790 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
187a0 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
187b0 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
187c0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
187d0 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
187e0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
187f0 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
18800 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
18810 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
18820 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
18830 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
18840 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
18850 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
18860 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
18870 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
18880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18890 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
188a0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
188b0 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20  ngIdx, j);.     
188c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
188d0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
188e0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
188f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18900 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
18910 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
18920 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
18930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18940 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
18950 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a  emStore, iBMem+j
18960 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  , j<pGroupBy->nE
18970 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xpr-1);.      }.
18980 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f        for(j=pGro
18990 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a  upBy->nExpr-1; j
189a0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
189b0 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42     if( j<pGroupB
189c0 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  y->nExpr-1 ){.  
189d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
189e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
189f0 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c  emLoad, iBMem+j,
18a00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
18a10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18a20 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
18a30 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20  mLoad, iAMem+j, 
18a40 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
18a50 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j==0 ){.        
18a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18a70 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 2c 20  Op(v, OP_Eq, 0, 
18a80 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 29 3b  addrProcessRow);
18a90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18aa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18ab0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
18ac0 5f 4e 65 2c 20 30 78 31 30 30 2c 20 61 64 64 72  _Ne, 0x100, addr
18ad0 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29 3b 0a  GroupByChange);.
18ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18b00 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f  ngeP3(v, -1, (vo
18b10 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  id*)pKeyInfo->aC
18b20 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53  oll[j], P3_COLLS
18b30 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  EQ);.      }..  
18b40 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
18b50 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
18b60 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
18b70 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
18b80 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e      ** Change in
18b90 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
18ba0 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
18bb0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
18bc0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
18bd0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
18be0 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
18bf0 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
18c00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18c10 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
18c20 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
18c30 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
18c40 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
18c50 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
18c60 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
18c70 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
18c80 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
18c90 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
18ca0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
18cb0 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
18cc0 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
18cd0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
18ce0 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
18cf0 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
18d00 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
18d10 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18d20 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79 43 68  v, addrGroupByCh
18d30 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  ange);.      for
18d40 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
18d50 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
18d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18d70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
18d80 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20  mLoad, iBMem+j, 
18d90 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
18da0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
18db0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 41 4d  OP_MemStore, iAM
18dc0 65 6d 2b 6a 2c 20 31 29 3b 0a 20 20 20 20 20 20  em+j, 1);.      
18dd0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
18de0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
18df0 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75 74  osub, 0, addrOut
18e00 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
18e10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
18e20 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
18e30 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
18e40 45 6e 64 29 3b 0a 20 20 20 20 20 20 72 65 73 65  End);.      rese
18e50 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
18e60 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
18e70 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
18e80 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
18e90 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
18ea0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
18eb0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
18ec0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
18ed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
18ee0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18ef0 61 62 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63  abel(v, addrProc
18f00 65 73 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75  essRow);.      u
18f10 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
18f20 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
18f30 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
18f40 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
18f50 50 5f 4d 65 6d 49 6e 63 72 2c 20 69 55 73 65 46  P_MemIncr, iUseF
18f60 6c 61 67 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  lag, 0);..      
18f70 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
18f80 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
18f90 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
18fa0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
18fb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
18fc0 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e   OP_Next, sAggIn
18fd0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61  fo.sortingIdx, a
18fe0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20  ddrTopOfLoop);. 
18ff0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19000 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
19010 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
19020 20 20 20 20 20 75 6e 63 72 65 61 74 65 53 6f 72       uncreateSor
19030 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
19040 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
19050 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
19060 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
19070 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
19080 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
19090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
190a0 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
190b0 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
190c0 77 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 7d  w);.      .    }
190d0 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
190e0 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  By */.    else {
190f0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
19100 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
19110 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
19120 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
19130 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
19140 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
19150 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
19160 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
19170 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
19180 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
19190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
191a0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
191b0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
191c0 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  o);.      pWInfo
191d0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
191e0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
191f0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 30  bList, pWhere, 0
19200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
19210 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
19220 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
19230 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
19240 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
19250 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
19260 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
19270 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  fo);.      final
19280 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
19290 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
192a0 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  o);.      pOrder
192b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
192c0 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
192d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
192e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
192f0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
19300 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
19310 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
19320 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
19330 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
19340 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20  0, -1, .        
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44                eD
19360 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 64 64 72  est, iParm, addr
19370 45 6e 64 2c 20 61 64 64 72 45 6e 64 2c 20 61 66  End, addrEnd, af
19380 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  f);.    }.    sq
19390 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
193a0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
193b0 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
193c0 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
193d0 75 65 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  uery */..  /* If
193e0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
193f0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
19400 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
19410 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
19420 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
19430 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
19440 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
19450 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
19460 79 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  y ){.    generat
19470 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
19480 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
19490 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69 50  nExpr, eDest, iP
194a0 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  arm);.  }..#ifnd
194b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
194c0 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20  UBQUERY.  /* If 
194d0 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
194e0 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
194f0 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
19500 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
19510 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
19520 62 6c 65 2e 20 20 53 6f 20 64 65 6c 65 74 65 20  ble.  So delete 
19530 74 68 65 20 73 75 62 71 75 65 72 79 20 73 74 72  the subquery str
19540 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
19550 70 61 72 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 70  parent.  ** to p
19560 72 65 76 65 6e 74 20 74 68 69 73 20 73 75 62 71  revent this subq
19570 75 65 72 79 20 66 72 6f 6d 20 62 65 69 6e 67 20  uery from being 
19580 65 76 61 6c 75 61 74 65 64 20 61 67 61 69 6e 20  evaluated again 
19590 61 6e 64 20 74 6f 20 66 6f 72 63 65 20 74 68 65  and to force the
195a0 0a 20 20 2a 2a 20 74 68 65 20 75 73 65 20 6f 66  .  ** the use of
195b0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
195c0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
195d0 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20   pParent ){.    
195e0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
195f0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65  >pSrc->nSrc>pare
19600 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73  ntTab );.    ass
19610 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53  ert( pParent->pS
19620 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d  rc->a[parentTab]
19630 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20  .pSelect==p );. 
19640 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
19650 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 20 20 70  Delete(p);.    p
19660 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b  Parent->pSrc->a[
19670 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65  parentTab].pSele
19680 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  ct = 0;.  }.#end
19690 69 66 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  if..  /* The SEL
196a0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
196b0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
196c0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
196d0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
196e0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
196f0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
19700 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
19710 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
19720 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
19730 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
19740 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
19750 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
19760 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
19770 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  */.select_end:. 
19780 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67   sqliteFree(sAgg
19790 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
197a0 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66  liteFree(sAggInf
197b0 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75  o.aFunc);.  retu
197c0 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.