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

Artifact 5a96555ea29482d0f1ebefe63831a1f4ded562b9:


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 34 36  select.c,v 1.246
0200: 20 32 30 30 35 2f 30 35 2f 31 36 20 32 32 3a 33   2005/05/16 22:3
0210: 37 3a 35 35 20 64 72 68 20 45 78 70 20 24 0a 2a  7:55 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0250: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0260: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0270: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0280: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0290: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
02a0: 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72 4c  lectNew(.  ExprL
02b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
02c0: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
02d0: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
02e0: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
02f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0300: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0310: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0320: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0330: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0340: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0350: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0360: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0370: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0380: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0390: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
03a0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
03b0: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
03c0: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
03d0: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
03e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
03f0: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  use */.  int isD
0400: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 2f  istinct,       /
0410: 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44 49  * true if the DI
0420: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0430: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 45  s present */.  E
0440: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20  xpr *pLimit,    
0450: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61       /* LIMIT va
0460: 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73  lue.  NULL means
0470: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 45   not used */.  E
0480: 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20 20  xpr *pOffset    
0490: 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20 76       /* OFFSET v
04a0: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
04b0: 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29  s no offset */.)
04c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
04d0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
04e0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
04f0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65  *pNew) );.  asse
0500: 72 74 28 20 21 70 4f 66 66 73 65 74 20 7c 7c 20  rt( !pOffset || 
0510: 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20 43  pLimit );   /* C
0520: 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45 54  an't have OFFSET
0530: 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e 20   without LIMIT. 
0540: 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  */.  if( pNew==0
0550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0560: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45  xprListDelete(pE
0570: 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
0580: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
0590: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
05a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 57 68  e3ExprDelete(pWh
05b0: 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
05c0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
05d0: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
05e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
05f0: 28 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  (pHaving);.    s
0600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
0610: 6c 65 74 65 28 70 4f 72 64 65 72 42 79 29 3b 0a  lete(pOrderBy);.
0620: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
0630: 65 6c 65 74 65 28 70 4c 69 6d 69 74 29 3b 0a 20  elete(pLimit);. 
0640: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0650: 6c 65 74 65 28 70 4f 66 66 73 65 74 29 3b 0a 20  lete(pOffset);. 
0660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
0670: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0680: 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69     pEList = sqli
0690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
06a0: 64 28 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  d(0, sqlite3Expr
06b0: 28 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20  (TK_ALL,0,0,0), 
06c0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  0);.    }.    pN
06d0: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c  ew->pEList = pEL
06e0: 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ist;.    pNew->p
06f0: 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
0700: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0710: 57 68 65 72 65 3b 0a 20 20 20 20 70 4e 65 77 2d  Where;.    pNew-
0720: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
0730: 75 70 42 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  upBy;.    pNew->
0740: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0750: 67 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  g;.    pNew->pOr
0760: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
0770: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 73 44 69  ;.    pNew->isDi
0780: 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74 69  stinct = isDisti
0790: 6e 63 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  nct;.    pNew->o
07a0: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
07b0: 20 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20     pNew->pLimit 
07c0: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 4e  = pLimit;.    pN
07d0: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
07e0: 66 66 73 65 74 3b 0a 20 20 20 20 70 4e 65 77 2d  ffset;.    pNew-
07f0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
0800: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
0810: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
0820: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0830: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
0840: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
0850: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0860: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0870: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0880: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0890: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
08a0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
08b0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
08c0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
08d0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
08e0: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
08f0: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0900: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0910: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0920: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0930: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0940: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0950: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0960: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0970: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0980: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0990: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
09a0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
09b0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
09c0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
09d0: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
09e0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
09f0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0a10: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0a20: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0a30: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0a40: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0a50: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0a60: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0a70: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0a80: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0a90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0aa0: 20 2a 7a 4b 65 79 77 6f 72 64 3b 0a 20 20 20 20   *zKeyword;.    
0ab0: 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38  u8 nChar;.    u8
0ac0: 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f   code;.  } keywo
0ad0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  rds[] = {.    { 
0ae0: 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54  "natural", 7, JT
0af0: 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20  _NATURAL },.    
0b00: 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20  { "left",    4, 
0b10: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
0b20: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74   },.    { "right
0b30: 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54  ",   5, JT_RIGHT
0b40: 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20  |JT_OUTER },.   
0b50: 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c   { "full",    4,
0b60: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48   JT_LEFT|JT_RIGH
0b70: 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  T|JT_OUTER },.  
0b80: 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35    { "outer",   5
0b90: 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20  , JT_OUTER },.  
0ba0: 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35    { "inner",   5
0bb0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20  , JT_INNER },.  
0bc0: 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35    { "cross",   5
0bd0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20  , JT_INNER },.  
0be0: 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  };.  int i, j;. 
0bf0: 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a   apAll[0] = pA;.
0c00: 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b    apAll[1] = pB;
0c10: 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43  .  apAll[2] = pC
0c20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33  ;.  for(i=0; i<3
0c30: 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b   && apAll[i]; i+
0c40: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41 6c  +){.    p = apAl
0c50: 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  l[i];.    for(j=
0c60: 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65 79 77  0; j<sizeof(keyw
0c70: 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79  ords)/sizeof(key
0c80: 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b  words[0]); j++){
0c90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
0ca0: 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68  =keywords[j].nCh
0cb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
0cc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
0cd0: 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b  (p->z, keywords[
0ce0: 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e  j].zKeyword, p->
0cf0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
0d00: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79   jointype |= key
0d10: 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20  words[j].code;. 
0d20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
0d40: 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65  if( j>=sizeof(ke
0d50: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0d60: 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20  eywords[0]) ){. 
0d70: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
0d80: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
0d90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0da0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
0db0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
0dc0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
0dd0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
0de0: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
0df0: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
0e00: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
0e10: 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20  st char *zSp1 = 
0e20: 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  " ";.    const c
0e30: 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b  har *zSp2 = " ";
0e40: 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30 20 29  .    if( pB==0 )
0e50: 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20  { zSp1++; }.    
0e60: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
0e70: 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  2++; }.    sqlit
0e80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
0e90: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
0ea0: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0eb0: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
0ec0: 25 54 25 73 25 54 25 73 25 54 22 2c 20 70 41 2c  %T%s%T%s%T", pA,
0ed0: 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c   zSp1, pB, zSp2,
0ee0: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
0ef0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
0f00: 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74   }else if( joint
0f10: 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29  ype & JT_RIGHT )
0f20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0f30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
0f40: 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20       "RIGHT and 
0f50: 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73  FULL OUTER JOINs
0f60: 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74   are not current
0f70: 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a  ly supported");.
0f80: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
0f90: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72  T_INNER;.  }.  r
0fa0: 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a  eturn jointype;.
0fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0fc0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63  the index of a c
0fd0: 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65  olumn in a table
0fe0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
0ff0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73  the column.** is
1000: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
1010: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a  n the table..*/.
1020: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d  static int colum
1030: 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  nIndex(Table *pT
1040: 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
1050: 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
1060: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
1070: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  b->nCol; i++){. 
1080: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1090: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
10a0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [i].zName, zCol)
10b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
10c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
10d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10e0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b  e value of a tok
10f0: 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74  en to a '\000'-t
1100: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
1110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1120: 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20   setToken(Token 
1130: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1140: 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a  z){.  p->z = z;.
1150: 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28    p->n = strlen(
1160: 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30  z);.  p->dyn = 0
1170: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
1180: 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48  a term to the WH
1190: 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ERE expression i
11a0: 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20 72  n *ppExpr that r
11b0: 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a  equires the.** z
11c0: 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  Col column to be
11d0: 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77   equal in the tw
11e0: 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20 61  o tables pTab1 a
11f0: 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61  nd pTab2..*/.sta
1200: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1210: 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63  eTerm(.  const c
1220: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20  har *zCol,      
1230: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1240: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
1250: 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c  st Table *pTab1,
1260: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1270: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1280: 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20  char *zAlias1,  
1290: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
12a0: 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d 61  first table.  Ma
12b0: 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  y be NULL */.  c
12c0: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
12d0: 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  2,      /* Secon
12e0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  d table */.  con
12f0: 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 32  st char *zAlias2
1300: 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66  ,     /* Alias f
1310: 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e  or second table.
1320: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1330: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
1340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1350: 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  dd the equality 
1360: 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70  term to this exp
1370: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
1380: 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 45  Token dummy;.  E
1390: 78 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62  xpr *pE1a, *pE1b
13a0: 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20  , *pE1c;.  Expr 
13b0: 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70  *pE2a, *pE2b, *p
13c0: 45 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b  E2c;.  Expr *pE;
13d0: 0a 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  ..  setToken(&du
13e0: 6d 6d 79 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45  mmy, zCol);.  pE
13f0: 31 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  1a = sqlite3Expr
1400: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64  (TK_ID, 0, 0, &d
1410: 75 6d 6d 79 29 3b 0a 20 20 70 45 32 61 20 3d 20  ummy);.  pE2a = 
1420: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
1430: 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29  D, 0, 0, &dummy)
1440: 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d  ;.  if( zAlias1=
1450: 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73  =0 ){.    zAlias
1460: 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  1 = pTab1->zName
1470: 3b 0a 20 20 7d 0a 20 20 73 65 74 54 6f 6b 65 6e  ;.  }.  setToken
1480: 28 26 64 75 6d 6d 79 2c 20 7a 41 6c 69 61 73 31  (&dummy, zAlias1
1490: 29 3b 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69  );.  pE1b = sqli
14a0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
14b0: 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  , 0, &dummy);.  
14c0: 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29  if( zAlias2==0 )
14d0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20  {.    zAlias2 = 
14e0: 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab2->zName;.  
14f0: 7d 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  }.  setToken(&du
1500: 6d 6d 79 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  mmy, zAlias2);. 
1510: 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 45   pE2b = sqlite3E
1520: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
1530: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 70 45 31 63   &dummy);.  pE1c
1540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
1550: 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31  K_DOT, pE1b, pE1
1560: 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20  a, 0);.  pE2c = 
1570: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44  sqlite3Expr(TK_D
1580: 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20  OT, pE2b, pE2a, 
1590: 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74  0);.  pE = sqlit
15a0: 65 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45  e3Expr(TK_EQ, pE
15b0: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
15c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
15d0: 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
15e0: 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71  ;.  *ppExpr = sq
15f0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70  lite3ExprAnd(*pp
1600: 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a  Expr, pE);.}../*
1610: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1620: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1630: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1640: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1650: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1660: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1670: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
1680: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
1690: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
16a0: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
16b0: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
16c0: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
16d0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
16e0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
16f0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
1700: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
1710: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
1720: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
1730: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
1740: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
1750: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
1760: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
1770: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1780: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
1790: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
17a0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
17b0: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
17c0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
17d0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
17e0: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
17f0: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
1800: 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68  r(Expr *p){.  wh
1810: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
1820: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
1830: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1840: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
1850: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20  ->pLeft);.    p 
1860: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
1870: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
1880: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
1890: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
18a0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
18b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
18c0: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
18d0: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
18e0: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
18f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
1900: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
1910: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
1920: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
1930: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
1940: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
1950: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
1960: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
1970: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
1980: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
1990: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
19a0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
19b0: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
19c0: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
19d0: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
19e0: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
19f0: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
1a00: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
1a10: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
1a20: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
1a30: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
1a40: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
1a50: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
1a60: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
1a70: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
1a80: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
1a90: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
1aa0: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
1ab0: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
1ac0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1ad0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
1ae0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1af0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1b00: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
1b10: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
1b20: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
1b30: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
1b40: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
1b50: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b70: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
1b80: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1b90: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
1ba0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1bc0: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
1bd0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1be0: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
1bf0: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
1c00: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
1c10: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1c20: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
1c30: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
1c40: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
1c50: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1c60: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
1c70: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
1c80: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
1c90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
1ca0: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
1cb0: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
1cc0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
1cd0: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
1ce0: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
1cf0: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
1d00: 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69  ht->pTab;..    i
1d10: 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  f( pLeftTab==0 |
1d20: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29  | pRightTab==0 )
1d30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
1d40: 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55  /* When the NATU
1d50: 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70  RAL keyword is p
1d60: 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52  resent, add WHER
1d70: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
1d80: 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
1d90: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
1da0: 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20  two tables have 
1db0: 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a  in common..    *
1dc0: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
1dd0: 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
1de0: 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20  ATURAL ){.      
1df0: 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c  if( pLeft->pOn |
1e00: 7c 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20  | pLeft->pUsing 
1e10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e30: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
1e40: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
1e50: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
1e60: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
1e70: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
1e80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1e90: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
1ea0: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
1eb0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1ec0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1ed0: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
1ee0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
1ef0: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
1f00: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
1f10: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1f20: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
1f30: 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62  (zName, pLeftTab
1f40: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
1f50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
1f80: 74 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70  t->zAlias, &p->p
1f90: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
1fa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1fb0: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
1fc0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
1fd0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
1fe0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
1ff0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  */.    if( pLeft
2000: 2d 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e  ->pOn && pLeft->
2010: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2020: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2030: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2040: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2050: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2060: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2070: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2080: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2090: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
20a0: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
20b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20c0: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
20d0: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
20e0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
20f0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2100: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a  ( pLeft->pOn ){.
2110: 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70        setJoinExp
2120: 72 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20  r(pLeft->pOn);. 
2130: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
2140: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2150: 70 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74  p->pWhere, pLeft
2160: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c  ->pOn);.      pL
2170: 65 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  eft->pOn = 0;.  
2180: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
2190: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
21a0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
21b0: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
21c0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
21d0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
21e0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
21f0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
2200: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
2210: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
2220: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
2230: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
2240: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
2250: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
2260: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2270: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
2280: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
2290: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
22a0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
22b0: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
22c0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
22d0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
22e0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
22f0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
2300: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
2310: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2320: 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  eft->pUsing ){. 
2330: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
2340: 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69  st = pLeft->pUsi
2350: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
2360: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
2370: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2380: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69  har *zName = pLi
2390: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
23a0: 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75          if( colu
23b0: 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62  mnIndex(pLeftTab
23c0: 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f  , zName)<0 || co
23d0: 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74  lumnIndex(pRight
23e0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b  Tab, zName)<0 ){
23f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2400: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2410: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
2420: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
2430: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
2440: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
2450: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
2460: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
2470: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2490: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
24a0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
24b0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
24c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
24e0: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
24f0: 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65  zAlias, &p->pWhe
2500: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
2530: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
2540: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
2550: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2560: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
2570: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
2580: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
2590: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
25a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
25b0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
25c0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73  (p->pEList);.  s
25d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
25e0: 65 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20  ete(p->pSrc);.  
25f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2600: 65 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  e(p->pWhere);.  
2610: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2620: 65 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42  elete(p->pGroupB
2630: 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  y);.  sqlite3Exp
2640: 72 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69  rDelete(p->pHavi
2650: 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ng);.  sqlite3Ex
2660: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
2670: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c  pOrderBy);.  sql
2680: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
2690: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73  (p->pPrior);.  s
26a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26b0: 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73  (p->pLimit);.  s
26c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
26d0: 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
26e0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
2700: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
2710: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
2720: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
2730: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
2740: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
2750: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2760: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
2770: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2780: 56 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73  Vdbe *v, ExprLis
2790: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
27a0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
27b0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
27c0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
27d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
27e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
27f0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2800: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
2810: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
2820: 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d  ecord, pOrderBy-
2830: 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 73 71  >nExpr, 0);.  sq
2840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2850: 2c 20 4f 50 5f 53 6f 72 74 50 75 74 2c 20 30 2c  , OP_SortPut, 0,
2860: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   0);.}../*.** Ad
2870: 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  d code to implem
2880: 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 20 61  ent the OFFSET a
2890: 6e 64 20 4c 49 4d 49 54 0a 2a 2f 0a 73 74 61 74  nd LIMIT.*/.stat
28a0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4c 69 6d 69  ic void codeLimi
28b0: 74 65 72 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ter(.  Vdbe *v, 
28c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
28d0: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
28e0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
28f0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
2900: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2910: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
2920: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
2930: 69 6e 75 65 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  inue,    /* Jump
2940: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
2950: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
2960: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
2970: 2c 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ,       /* Jump 
2980: 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20  here to end the 
2990: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  loop */.  int nP
29a0: 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  op          /* N
29b0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
29c0: 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e  o pop stack when
29d0: 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20   jumping */.){. 
29e0: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e   if( p->iOffset>
29f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
2a00: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2a10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
2a20: 20 33 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70   3;.    if( nPop
2a30: 3e 30 20 29 20 61 64 64 72 2b 2b 3b 0a 20 20 20  >0 ) addr++;.   
2a40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a50: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c  p(v, OP_MemIncr,
2a60: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 30 29 3b   p->iOffset, 0);
2a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
2a90: 6d 50 6f 73 2c 20 70 2d 3e 69 4f 66 66 73 65 74  mPos, p->iOffset
2aa0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
2ab0: 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20   nPop>0 ){.     
2ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ad0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f  p(v, OP_Pop, nPo
2ae0: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p, 0);.    }.   
2af0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b00: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
2b10: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
2b20: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2b30: 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20   "# skip OFFSET 
2b40: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 7d 0a  records"));.  }.
2b50: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
2b60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2b70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2b80: 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69 4c 69  _MemIncr, p->iLi
2b90: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
2ba0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2bb0: 2c 20 22 23 20 65 78 69 74 20 77 68 65 6e 20 4c  , "# exit when L
2bc0: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
2bd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2be0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
2bf0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
2c00: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
2c10: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
2c20: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
2c30: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
2c40: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
2c50: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
2c60: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
2c70: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
2c80: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
2c90: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
2ca0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
2cb0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
2cc0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
2cd0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
2ce0: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
2cf0: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
2d00: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
2d10: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
2d20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2d30: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
2d40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d60: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
2d70: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d90: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
2da0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
2db0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
2dc0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2dd0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
2de0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
2df0: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
2e00: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
2e10: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
2e20: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
2e30: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
2e40: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
2e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
2e60: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
2e70: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
2e80: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
2e90: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2ea0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
2eb0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
2ec0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
2ed0: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
2ee0: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
2ef0: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
2f00: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
2f10: 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20   eDest,         
2f20: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
2f30: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
2f40: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
2f50: 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
2f60: 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65 6e     /* An argumen
2f70: 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73 61  t to the disposa
2f80: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
2f90: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
2fa0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
2fb0: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
2fc0: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
2fd0: 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20    int iBreak,   
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
2ff0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
3000: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
3010: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
3020: 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20  *aff            
3030: 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20 73     /* affinity s
3040: 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20 69  tring if eDest i
3050: 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 29  s SRT_Union */.)
3060: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3070: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
3080: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44  nt i;.  int hasD
3090: 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
30a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
30b0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
30c0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20  is present */.. 
30d0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
30e0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
30f0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
3100: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
3110: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  a LIMIT clause o
3120: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
3130: 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f 20  tement, then do 
3140: 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20 74  the check.  ** t
3150: 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  o see if this ro
3160: 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74 70  w should be outp
3170: 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44 69  ut..  */.  hasDi
3180: 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63  stinct = distinc
3190: 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 20 26  t>=0 && pEList &
31a0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
31b0: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
31c0: 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  y==0 && !hasDist
31d0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65  inct ){.    code
31e0: 4c 69 6d 69 74 65 72 28 76 2c 20 70 2c 20 69 43  Limiter(v, p, iC
31f0: 6f 6e 74 69 6e 75 65 2c 20 69 42 72 65 61 6b 2c  ontinue, iBreak,
3200: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3210: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3220: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
3230: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
3240: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3250: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
3260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3270: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
3280: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
32a0: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
32b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
32c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
32d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
32e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
32f0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3300: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
3310: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  pr);.    }.  }..
3320: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3330: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3340: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3350: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3360: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3370: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3380: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3390: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
33a0: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
33b0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
33c0: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
33d0: 63 74 20 29 7b 0a 23 69 66 20 4e 55 4c 4c 5f 41  ct ){.#if NULL_A
33e0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 0a 20  LWAYS_DISTINCT. 
33f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3400: 64 4f 70 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  dOp(v, OP_IsNull
3410: 2c 20 2d 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  , -pEList->nExpr
3420: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3430: 72 65 6e 74 41 64 64 72 28 76 29 2b 37 29 3b 0a  rentAddr(v)+7);.
3440: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 44 65  #endif.    /* De
3450: 6c 69 62 65 72 61 74 65 6c 79 20 6c 65 61 76 65  liberately leave
3460: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
3470: 72 69 6e 67 20 6f 66 66 20 6f 66 20 74 68 65 20  ring off of the 
3480: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
3490: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 2a   OP_MakeRecord *
34a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
34b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
34c0: 65 52 65 63 6f 72 64 2c 20 70 45 4c 69 73 74 2d  eRecord, pEList-
34d0: 3e 6e 45 78 70 72 20 2a 20 2d 31 2c 20 30 29 3b  >nExpr * -1, 0);
34e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
34f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74  AddOp(v, OP_Dist
3500: 69 6e 63 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  inct, distinct, 
3510: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3520: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
3530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3540: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 70 45  Op(v, OP_Pop, pE
3550: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 31 2c 20 30  List->nExpr+1, 0
3560: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3570: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
3580: 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65  to, 0, iContinue
3590: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
35a0: 6e 74 28 28 76 2c 20 22 23 20 73 6b 69 70 20 69  nt((v, "# skip i
35b0: 6e 64 69 73 74 69 6e 63 74 20 72 65 63 6f 72 64  ndistinct record
35c0: 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  s"));.    sqlite
35d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
35e0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
35f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3600: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
3610: 74 72 4b 65 79 2c 20 64 69 73 74 69 6e 63 74 2c  trKey, distinct,
3620: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72   0);.    if( pOr
3630: 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
3640: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
3650: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69   p, iContinue, i
3660: 42 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Break, nColumn);
3670: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
3680: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 23  itch( eDest ){.#
3690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
36a0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
36b0: 43 54 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  CT.    /* In thi
36c0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
36d0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
36e0: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
36f0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
3700: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
3710: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3720: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
3730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3740: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3750: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e  cord, nColumn, N
3760: 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49  ULL_ALWAYS_DISTI
3770: 4e 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NCT);.      sqli
3780: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3790: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53  v, -1, aff, P3_S
37a0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71  TATIC);.      sq
37b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
37c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
37d0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
37e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
37f0: 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 69 50 61  P_PutStrKey, iPa
3800: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
3810: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3820: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
3830: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
3840: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
3850: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
3860: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
3870: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
3880: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
3890: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
38a0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
38b0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
38c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
38d0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
38e0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
38f0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
3900: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3910: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
3920: 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57  Column, NULL_ALW
3930: 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b 0a 20  AYS_DISTINCT);. 
3940: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3950: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
3960: 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  aff, P3_STATIC);
3970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3980: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
3990: 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c 20 61  tFound, iParm, a
39a0: 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  ddr+3);.      sq
39b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
39c0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 50 61  , OP_Delete, iPa
39d0: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
39e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
39f0: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
3a00: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
3a10: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
3a20: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
3a30: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
3a40: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
3a50: 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20 20  empTable: {.    
3a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3a70: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3a80: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ord, nColumn, 0)
3a90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3aa0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3ab0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3ac0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3ad0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3ae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3af0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3b00: 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72 6d  _NewRecno, iParm
3b10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
3b20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3b30: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
3b40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3b50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3b60: 5f 50 75 74 49 6e 74 4b 65 79 2c 20 69 50 61 72  _PutIntKey, iPar
3b70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m, 0);.      }. 
3b80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3b90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3ba0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
3bb0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
3bc0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
3bd0: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
3be0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
3bf0: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
3c00: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
3c10: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
3c20: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
3c30: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
3c40: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
3c50: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
3c60: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
3c70: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
3c80: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
3c90: 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65  t addr1 = sqlite
3ca0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3cb0: 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  (v);.      int a
3cc0: 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73  ddr2;..      ass
3cd0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
3ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3cf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3d00: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
3d10: 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  r1+3);.      sql
3d20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3d30: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
3d40: 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71        addr2 = sq
3d50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3d60: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
3d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
3d80: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
3d90: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
3da0: 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72  Parse, v, pOrder
3db0: 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  By);.      }else
3dc0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  {.        char a
3dd0: 66 66 20 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29  ff = (iParm>>16)
3de0: 26 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 61  &0xFF;.        a
3df0: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
3e00: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
3e10: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
3e20: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71  aff);.        sq
3e30: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
3e40: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
3e50: 2c 20 30 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20  , 0, &aff, 1);. 
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 53 74  beAddOp(v, OP_St
3e80: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
3e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
3ea0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74  eAddOp(v, OP_Put
3eb0: 53 74 72 4b 65 79 2c 20 28 69 50 61 72 6d 26 30  StrKey, (iParm&0
3ec0: 78 30 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a  x0000FFFF), 0);.
3ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
3ee0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3ef0: 32 28 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69  2(v, addr2, sqli
3f00: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3f10: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72  dr(v));.      br
3f20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3f30: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
3f40: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
3f50: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
3f60: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
3f70: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
3f80: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
3f90: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
3fa0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
3fb0: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
3fc0: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
3fd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
3fe0: 20 53 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20   SRT_Exists:.   
3ff0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
4000: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
4010: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
4020: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
4030: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
4040: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
4050: 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , v, pOrderBy);.
4060: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4080: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
4090: 74 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b  tore, iParm, 1);
40a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
40b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
40c0: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
40d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
40e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
40f0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
4100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4110: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
4120: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
4130: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
4140: 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
4150: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4160: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
4170: 54 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20  T_Sorter: {.    
4180: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4190: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
41a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
41b0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
41c0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
41d0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
41e0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
41f0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
4200: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
4210: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  rt( eDest==SRT_C
4220: 61 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  allback );.     
4230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4240: 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61  dOp(v, OP_Callba
4250: 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  ck, nColumn, 0);
4260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4270: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4280: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 20 73 75 62   /* Invoke a sub
4290: 72 6f 75 74 69 6e 65 20 74 6f 20 68 61 6e 64 6c  routine to handl
42a0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  e the results.  
42b0: 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  The subroutine i
42c0: 74 73 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20  tself.    ** is 
42d0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
42e0: 70 6f 70 70 69 6e 67 20 74 68 65 20 72 65 73 75  popping the resu
42f0: 6c 74 73 20 6f 66 66 20 6f 66 20 74 68 65 20 73  lts off of the s
4300: 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tack..    */.   
4310: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
4320: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
4330: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4360: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4370: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75  , 0);.        pu
4380: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
4390: 72 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79  rse, v, pOrderBy
43a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
43b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
43c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
43d0: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
43e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
43f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
4400: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4410: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
4420: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
4430: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
4440: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
4450: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
4460: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
4470: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
4480: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
4490: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
44a0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
44b0: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
44c0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
44d0: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
44e0: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
44f0: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
4500: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
4510: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
4520: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
4530: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
4540: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
4550: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
4560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4570: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4580: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4590: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
45a0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
45b0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
45c0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
45d0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
45e0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
45f0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
4600: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
4610: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
4620: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
4630: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
4640: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
4650: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
4660: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
4670: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
4680: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
4690: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
46a0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
46b0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
46c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
46d0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
46e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
46f0: 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  e,   /* The pars
4700: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
4710: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4720: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
4730: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
4740: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
4750: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4760: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
4770: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
4780: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
4790: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
47a0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
47b0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
47c0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
47d0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
47e0: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
47f0: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
4800: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
4810: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
4820: 7b 0a 20 20 69 6e 74 20 65 6e 64 31 20 3d 20 73  {.  int end1 = s
4830: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4840: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 65 6e  bel(v);.  int en
4850: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
4860: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4870: 69 6e 74 20 61 64 64 72 3b 0a 20 20 4b 65 79 49  int addr;.  KeyI
4880: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 45 78  nfo *pInfo;.  Ex
4890: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
48a0: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b  ;.  int nCol, i;
48b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
48c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
48d0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
48e0: 6f 72 74 65 72 20 29 20 72 65 74 75 72 6e 3b 0a  orter ) return;.
48f0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
4900: 70 4f 72 64 65 72 42 79 3b 0a 20 20 6e 43 6f 6c  pOrderBy;.  nCol
4910: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
4920: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
4930: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4940: 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 43 6f  of(*pInfo) + nCo
4950: 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  l*(sizeof(CollSe
4960: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
4970: 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  pInfo==0 ) retur
4980: 6e 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72  n;.  pInfo->aSor
4990: 74 4f 72 64 65 72 20 3d 20 28 63 68 61 72 2a 29  tOrder = (char*)
49a0: 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43  &pInfo->aColl[nC
49b0: 6f 6c 5d 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 46  ol];.  pInfo->nF
49c0: 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 20 20 66  ield = nCol;.  f
49d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
49e0: 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  i++){.    /* If 
49f0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4a00: 65 6e 63 65 20 77 61 73 20 73 70 65 63 69 66 69  ence was specifi
4a10: 65 64 20 65 78 70 6c 69 63 69 74 79 2c 20 74 68  ed explicity, th
4a20: 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  en it.    ** is 
4a30: 73 74 6f 72 65 64 20 69 6e 20 70 4f 72 64 65 72  stored in pOrder
4a40: 42 79 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2e 20  By->a[i].zName. 
4a50: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
4a60: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  he default.    *
4a70: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
4a80: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
4a90: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
4aa0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
4ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
4ac0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4f 72  lSeq(pParse, pOr
4ad0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
4ae0: 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 6e  r);.    if( !pIn
4af0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
4b00: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
4b10: 6c 6c 5b 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c  ll[i] = db->pDfl
4b20: 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  tColl;.    }.   
4b30: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
4b40: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
4b50: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
4b60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4b70: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  dbeOp3(v, OP_Sor
4b80: 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  t, 0, 0, (char*)
4b90: 70 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  pInfo, P3_KEYINF
4ba0: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 61 64  O_HANDOFF);.  ad
4bb0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4bc0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
4bd0: 4e 65 78 74 2c 20 30 2c 20 65 6e 64 31 29 3b 0a  Next, 0, end1);.
4be0: 20 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c    codeLimiter(v,
4bf0: 20 70 2c 20 61 64 64 72 2c 20 65 6e 64 32 2c 20   p, addr, end2, 
4c00: 31 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44  1);.  switch( eD
4c10: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
4c20: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
4c30: 61 73 65 20 53 52 54 5f 54 65 6d 70 54 61 62 6c  ase SRT_TempTabl
4c40: 65 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e: {.      sqlit
4c50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4c60: 50 5f 4e 65 77 52 65 63 6e 6f 2c 20 69 50 61 72  P_NewRecno, iPar
4c70: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
4c80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4c90: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
4ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4cb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
4cc0: 74 49 6e 74 4b 65 79 2c 20 69 50 61 72 6d 2c 20  tIntKey, iParm, 
4cd0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4ce0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
4cf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4d00: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
4d10: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
4d20: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4d30: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4d40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4d50: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 73 71  _NotNull, -1, sq
4d60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4d70: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
4d80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4d90: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
4da0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
4db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4dc0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74  P_Goto, 0, sqlit
4dd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4de0: 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20 20 73  r(v)+3);.      s
4df0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
4e00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4e10: 31 2c 20 30 2c 20 22 6e 22 2c 20 50 33 5f 53 54  1, 0, "n", P3_ST
4e20: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
4e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4e40: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
4e50: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4e60: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4e70: 5f 50 75 74 53 74 72 4b 65 79 2c 20 28 69 50 61  _PutStrKey, (iPa
4e80: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
4e90: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4eb0: 53 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20 20  SRT_Exists:.    
4ec0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
4ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
4ee0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
4ef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f00: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
4f10: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
4f40: 20 30 2c 20 65 6e 64 31 29 3b 0a 20 20 20 20 20   0, end1);.     
4f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4f60: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
4f70: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
4f80: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
4f90: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
4fa0: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
4fb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4fc0: 5f 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c  _Integer, p->pEL
4fd0: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a  ist->nExpr, 0);.
4fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4ff0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
5000: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
5010: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5020: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5040: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
5050: 20 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20   -1-i, i);.     
5060: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65   }.      if( eDe
5070: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
5080: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
5090: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
50a0: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f  OP_Callback, nCo
50b0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
50c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
50d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
50e0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
50f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
5100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
5120: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 2, 0);.      b
5130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5140: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
5150: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
5160: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
5170: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5180: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5190: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
51a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
51b0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
51c0: 6e 64 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  nd2);.  sqlite3V
51d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
51e0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 73 71 6c  op, 1, 0);.  sql
51f0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
5200: 61 62 65 6c 28 76 2c 20 65 6e 64 31 29 3b 0a 20  abel(v, end1);. 
5210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5220: 70 28 76 2c 20 4f 50 5f 53 6f 72 74 52 65 73 65  p(v, OP_SortRese
5230: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
5240: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
5250: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
5260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
5270: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5280: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
5290: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
52a0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
52b0: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
52c0: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
52d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 65  .**.** If the de
52e0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
52f0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
5300: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
5310: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a  extracted from.*
5320: 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 43  * the original C
5330: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5340: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
5350: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
5360: 75 6d 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  umn..** .** The 
5370: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
5380: 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69   for an expressi
5390: 6f 6e 20 69 73 20 65 69 74 68 65 72 20 54 45 58  on is either TEX
53a0: 54 2c 20 4e 55 4d 45 52 49 43 20 6f 72 20 41 4e  T, NUMERIC or AN
53b0: 59 2e 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  Y..** The declar
53c0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
53d0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
53e0: 49 4e 54 45 47 45 52 2e 0a 2a 2f 0a 73 74 61 74  INTEGER..*/.stat
53f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
5400: 6f 6c 75 6d 6e 54 79 70 65 28 4e 61 6d 65 43 6f  olumnType(NameCo
5410: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
5420: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
5430: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 3b 0a 20   const *zType;. 
5440: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45   int j;.  if( pE
5450: 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70  xpr==0 || pNC->p
5460: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
5470: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65  urn 0;..  /* The
5480: 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20   TK_AS operator 
5490: 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
54a0: 6e 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55  n ORDER BY, GROU
54b0: 50 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20  P BY, HAVING,.  
54c0: 2a 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61  ** and LIMIT cla
54d0: 75 73 65 73 2e 20 20 42 75 74 20 70 45 78 70 72  uses.  But pExpr
54e0: 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74   originates in t
54f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
5500: 20 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20   a.  ** SELECT. 
5510: 20 53 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65   So pExpr can ne
5520: 76 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41  ver contain an A
5530: 53 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  S operator..  */
5540: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
5550: 2d 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a  ->op!=TK_AS );..
5560: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
5570: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
5580: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
5590: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
55a0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   0;.      int iC
55b0: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
55c0: 75 6d 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  umn;.      while
55d0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
55e0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
55f0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
5600: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
5610: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
5620: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
5630: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
5640: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
5650: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
5660: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
5670: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
5680: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
5690: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
56a0: 62 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  b;.        }else
56b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
56c0: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
56d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
56e0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
56f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
5700: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
5710: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
5720: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
5730: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
5740: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
5750: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
5760: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
5770: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
5780: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
5790: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
57a0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
57b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
57c0: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
57d0: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
57e0: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
57f0: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
5800: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
5810: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
5820: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
5830: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
5840: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
5850: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
5860: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
5870: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
5880: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
5890: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
58a0: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
58b0: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
58c0: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
58d0: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
58e0: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
58f0: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
5900: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
5910: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
5920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5930: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
5940: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
5950: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
5960: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
5970: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
5980: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
5990: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
59a0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
59b0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
59c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
59d0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 7d 65  TEGER";.      }e
59e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  lse{.        zTy
59f0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
5a00: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
5a10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5a20: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
5a30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5a40: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
5a50: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
5a60: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
5a70: 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  ;.      Select *
5a80: 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  pS = pExpr->pSel
5a90: 65 63 74 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  ect;.      sNC.p
5aa0: 53 72 63 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  SrcList = pExpr-
5ab0: 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
5ac0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
5ad0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 7a 54 79  = pNC;.      zTy
5ae0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
5af0: 26 73 4e 43 2c 20 70 53 2d 3e 70 45 4c 69 73 74  &sNC, pS->pEList
5b00: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 20 0a  ->a[0].pExpr); .
5b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
5b30: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 7a 54 79  fault:.      zTy
5b40: 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 0a 20  pe = 0;.  }.  . 
5b50: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
5b60: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5b70: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
5b80: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
5b90: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5ba0: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
5bb0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
5bc0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
5bd0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
5be0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
5bf0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
5c00: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
5c10: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
5c20: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
5c30: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
5c40: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5c50: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
5c60: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
5c70: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
5c80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5c90: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
5ca0: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
5cb0: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
5cc0: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
5cd0: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
5ce0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5cf0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
5d00: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
5d10: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
5d20: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
5d30: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
5d40: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79   p);.    if( zTy
5d50: 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
5d60: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ;.    /* The vdb
5d70: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73  e must make it's
5d80: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
5d90: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 2c 20 69 6e   column-type, in
5da0: 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
5db0: 2a 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  * schema is rese
5dc0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 76 69  t before this vi
5dd0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
5de0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
5df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5e00: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2b  SetColName(v, i+
5e10: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 7a  pEList->nExpr, z
5e20: 54 79 70 65 2c 20 73 74 72 6c 65 6e 28 7a 54 79  Type, strlen(zTy
5e30: 70 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pe));.  }.}../*.
5e40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
5e50: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
5e60: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
5e70: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
5e80: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5e90: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
5ea0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
5eb0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
5ec0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
5ed0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
5ee0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
5ef0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
5f00: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
5f10: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
5f20: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5f30: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
5f40: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
5f50: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
5f60: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
5f70: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
5f80: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
5f90: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
5fa0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5fb0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
5fc0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
5fd0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5fe0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
5ff0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
6000: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6010: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
6020: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
6030: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
6040: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
6050: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
6060: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6070: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
6080: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
6090: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
60a0: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
60b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
60c0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
60d0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
60e0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
60f0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
6100: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
6110: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
6120: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
6130: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6140: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
6150: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
6160: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
6170: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
6180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
6190: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
61a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
61b0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
61c0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
61d0: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
61e0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
61f0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
6200: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
6210: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
6220: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
6230: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6240: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
6250: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
6260: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
6270: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
6280: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
6290: 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  N && pTabList ){
62a0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
62b0: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
62c0: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
62d0: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
62e0: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
62f0: 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
6300: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
6310: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d  a[j].iCursor!=p-
6320: 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a  >iTable; j++){}.
6330: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
6340: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
6350: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
6360: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
6370: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
6380: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
6390: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
63a0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
63b0: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
63c0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
63d0: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
63e0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
63f0: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
6400: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6410: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
6420: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
6430: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
6440: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
6450: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
6460: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26   && p->span.z &&
6470: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
6480: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6490: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
64a0: 2c 20 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20  , i, p->span.z, 
64b0: 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  p->span.n);.    
64c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c    }else if( full
64d0: 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74  Names || (!short
64e0: 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73  Names && pTabLis
64f0: 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20  t->nSrc>1) ){.  
6500: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
6510: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
6520: 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20  har *zTab;. .   
6530: 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62       zTab = pTab
6540: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61  List->a[j].zAlia
6550: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  s;.        if( f
6560: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62  ullNames || zTab
6570: 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61  ==0 ) zTab = pTa
6580: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
6590: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
65a0: 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54 61 62 2c  ng(&zName, zTab,
65b0: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
65c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
65d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
65e0: 20 69 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59   i, zName, P3_DY
65f0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
6600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
6610: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
6620: 6d 65 28 76 2c 20 69 2c 20 7a 43 6f 6c 2c 20 73  me(v, i, zCol, s
6630: 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20  trlen(zCol));.  
6640: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
6650: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
6660: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
6670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6680: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
6690: 69 2c 20 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  i, p->span.z, p-
66a0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
66b0: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
66c0: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
66d0: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
66e0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
66f0: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
6700: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
6710: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
6720: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
6730: 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20   sprintf(zName, 
6740: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
6750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6760: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
6770: 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20   i, zName, 0);. 
6780: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
6790: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
67a0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
67b0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66   pEList);.}..#if
67c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
67d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
67e0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
67f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
6800: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
6810: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
6830: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
6840: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
6850: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
6860: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
6870: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
6880: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
6890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
68a0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
68b0: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
68c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
68d0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
68e0: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
68f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
6900: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
6910: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
6920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6930: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
6940: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6950: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
6960: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ECT */../*.** Fo
6970: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
6980: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
6990: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
69a0: 61 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  arse*, Select*);
69b0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
69c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
69d0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
69e0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
69f0: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
6a00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
6a10: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
6a20: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
6a30: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
6a40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6a50: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20  char *zTabName, 
6a60: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
6a70: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
6a80: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45  .  int i, j;.  E
6a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
6aa0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
6ab0: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70   *pCol;..  if( p
6ac0: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50  repSelectStmt(pP
6ad0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29  arse, pSelect) )
6ae0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6af0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
6b00: 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
6b10: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
6b20: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
6b30: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d   0;.  }.  pTab =
6b40: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
6b50: 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a  izeof(Table) );.
6b60: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
6b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6b80: 20 7d 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65   }.  pTab->zName
6b90: 20 3d 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71   = zTabName ? sq
6ba0: 6c 69 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e  liteStrDup(zTabN
6bb0: 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69  ame) : 0;.  pELi
6bc0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
6bd0: 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43  List;.  pTab->nC
6be0: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
6bf0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
6c00: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
6c10: 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f  pTab->aCol = aCo
6c20: 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
6c30: 28 20 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61  ( sizeof(pTab->a
6c40: 43 6f 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43  Col[0])*pTab->nC
6c50: 6f 6c 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  ol );.  for(i=0,
6c60: 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54   pCol=aCol; i<pT
6c70: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
6c80: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  Col++){.    Expr
6c90: 20 2a 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68   *p, *pR;.    ch
6ca0: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63  ar *zType;.    c
6cb0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
6cc0: 63 68 61 72 20 2a 7a 42 61 73 65 6e 61 6d 65 3b  char *zBasename;
6cd0: 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20  .    int cnt;.  
6ce0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
6cf0: 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47  C;.    .    /* G
6d00: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
6d10: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
6d20: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
6d30: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
6d40: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
6d50: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
6d60: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
6d70: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d  token.z==0 || p-
6d80: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  >pRight->token.z
6d90: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  [0]!=0 );.    if
6da0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
6db0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
6dc0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
6dd0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
6de0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
6df0: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
6e00: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
6e10: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
6e20: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
6e30: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  (zName);.    }el
6e40: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
6e50: 5f 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20  _DOT .          
6e60: 20 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52      && (pR=p->pR
6e70: 69 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e  ight)!=0 && pR->
6e80: 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74  token.z && pR->t
6e90: 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  oken.z[0] ){.   
6ea0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
6eb0: 73 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e  s of the from A.
6ec0: 42 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e  B use B as the n
6ed0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61  ame */.      zNa
6ee0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
6ef0: 6e 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74  ntf("%T", &pR->t
6f00: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oken);.    }else
6f10: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26   if( p->span.z &
6f20: 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29  & p->span.z[0] )
6f30: 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74  {.      /* Use t
6f40: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
6f50: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
6f60: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
6f70: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
6f80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
6f90: 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e  rintf("%T", &p->
6fa0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
6fb0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c  {.      /* If al
6fc0: 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61  l else fails, ma
6fd0: 6b 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a  ke up a name */.
6fe0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
6ff0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f  lite3MPrintf("co
7000: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20  lumn%d", i+1);. 
7010: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7020: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
7030: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
7040: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
7050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
7060: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  e(zName);.      
7070: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
7080: 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20  le(0, pTab);.   
7090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
70a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
70b0: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
70c0: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
70d0: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
70e0: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
70f0: 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65  ** append a inte
7100: 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
7110: 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
7120: 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
7130: 2f 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d 65 20  /.    zBasename 
7140: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f 72  = zName;.    for
7150: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
7160: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
7170: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
7180: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
7190: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
71a0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
71b0: 33 4d 50 72 69 6e 74 66 28 22 25 73 3a 25 64 22  3MPrintf("%s:%d"
71c0: 2c 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b 63  , zBasename, ++c
71d0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  nt);.        j =
71e0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
71f0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
7200: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7210: 0a 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61  .    if( zBasena
7220: 6d 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  me!=zName ){.   
7230: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42     sqliteFree(zB
7240: 61 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  asename);.    }.
7250: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
7260: 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  = zName;..    /*
7270: 20 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d   Get the typenam
7280: 65 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  e, type affinity
7290: 2c 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  , and collating 
72a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
72b0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  .    ** column..
72c0: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
72d0: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
72e0: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
72f0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
7300: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a  ect->pSrc;.    z
7310: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Type = sqliteStr
7320: 44 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 26  Dup(columnType(&
7330: 73 4e 43 2c 20 70 29 29 3b 0a 20 20 20 20 70 43  sNC, p));.    pC
7340: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70  ol->zType = zTyp
7350: 65 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  e;.    pCol->aff
7360: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
7370: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
7380: 20 20 20 20 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20      pCol->pColl 
7390: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
73a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
73b0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 2d 3e  .    if( !pCol->
73c0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
73d0: 43 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 70 50 61  Col->pColl = pPa
73e0: 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
73f0: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ll;.    }.  }.  
7400: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
7410: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
7420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
7430: 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  e a SELECT state
7440: 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
7450: 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65  ing by doing the
7460: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
7470: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings:.**.**    (
7480: 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
7490: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
74a0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
74b0: 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
74c0: 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
74d0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
74e0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
74f0: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
7500: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
7510: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
7520: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
7530: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
7540: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
7550: 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
7560: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7570: 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
7580: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
7590: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
75a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
75b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
75c0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
75d0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
75e0: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
75f0: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
7600: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
7610: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
7620: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
7630: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
7640: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
7650: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
7660: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
7670: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
7680: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
7690: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
76a0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
76b0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
76c0: 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
76d0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
76e0: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
76f0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
7700: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
7710: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
7720: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
7730: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
7740: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
7750: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
7760: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
7770: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
7780: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
7790: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
77a0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
77b0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
77c0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
77d0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
77e0: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
77f0: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
7800: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
7810: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
7820: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
7830: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
7840: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
7850: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
7860: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
7870: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
7880: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7890: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
78a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
78b0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
78c0: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
78d0: 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mt(Parse *pParse
78e0: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
78f0: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b  int i, j, k, rc;
7900: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
7910: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
7920: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c   *pEList;.  Tabl
7930: 65 20 2a 70 54 61 62 3b 0a 20 20 73 74 72 75 63  e *pTab;.  struc
7940: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
7950: 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d  pFrom;..  if( p=
7960: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
7970: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   || sqlite3_mall
7980: 6f 63 5f 66 61 69 6c 65 64 20 29 20 72 65 74 75  oc_failed ) retu
7990: 72 6e 20 31 3b 0a 20 20 70 54 61 62 4c 69 73 74  rn 1;.  pTabList
79a0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
79b0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
79c0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
79d0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
79e0: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
79f0: 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69  ned to all entri
7a00: 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46  es in.  ** the F
7a10: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
7a20: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
7a30: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  nt..  */.  sqlit
7a40: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
7a50: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
7a60: 2d 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c  ->pSrc);..  /* L
7a70: 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
7a80: 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
7a90: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
7aa0: 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
7ab0: 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
7ac0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
7ad0: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
7ae0: 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
7af0: 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
7b00: 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
7b10: 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
7b20: 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
7b30: 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
7b40: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
7b50: 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
7b60: 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
7b70: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
7b80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 72  ++){.    if( pFr
7b90: 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
7ba0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
7bb0: 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
7bc0: 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
7bd0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
7be0: 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
7bf0: 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
7c00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
7c10: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
7c20: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
7c30: 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
7c40: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
7c50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7c60: 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  RY.      /* A su
7c70: 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
7c80: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
7c90: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
7ca0: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
7cb0: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
7cc0: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41     if( pFrom->zA
7cd0: 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lias==0 ){.     
7ce0: 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73     pFrom->zAlias
7cf0: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
7d00: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c  ite3MPrintf("sql
7d10: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
7d20: 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d  ", (void*)pFrom-
7d30: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
7d40: 20 7d 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e   }.      pFrom->
7d50: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
7d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
7d70: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
7d80: 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a  pParse, pFrom->z
7d90: 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53  Alias, pFrom->pS
7da0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
7db0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7dc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
7de0: 54 68 65 20 69 73 54 72 61 6e 73 69 65 6e 74 20  The isTransient 
7df0: 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
7e00: 68 61 74 20 74 68 65 20 54 61 62 6c 65 20 73 74  hat the Table st
7e10: 72 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e  ructure has been
7e20: 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e 61 6d 69  .      ** dynami
7e30: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
7e40: 61 6e 64 20 6d 61 79 20 62 65 20 66 72 65 65 64  and may be freed
7e50: 20 61 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49   at any time.  I
7e60: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 20  n other words,. 
7e70: 20 20 20 20 20 2a 2a 20 70 54 61 62 20 69 73 20       ** pTab is 
7e80: 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  not pointing to 
7e90: 61 20 70 65 72 73 69 73 74 65 6e 74 20 74 61 62  a persistent tab
7ea0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
7eb0: 74 20 64 65 66 69 6e 65 73 0a 20 20 20 20 20 20  t defines.      
7ec0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
7ed0: 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20 20 20 20  chema. */.      
7ee0: 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e  pTab->isTransien
7ef0: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20  t = 1;.#endif.  
7f00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
7f10: 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
7f20: 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
7f30: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
7f40: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 70 46 72  use */.      pFr
7f50: 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
7f60: 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
7f70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
7f80: 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  arse,pFrom->zNam
7f90: 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
7fa0: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
7fb0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
7fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7fd0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7fe0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
7ff0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
8000: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
8010: 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
8020: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
8030: 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
8040: 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
8050: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
8060: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8070: 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
8080: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8090: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
80a0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72         /* If pFr
80b0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69  om->pSelect!=0 i
80c0: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
80d0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20  ealing with a.  
80e0: 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69        ** view wi
80f0: 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68  thin a view.  Th
8100: 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75  e SELECT structu
8110: 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  re has already b
8120: 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  een.        ** c
8130: 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74  opied by the out
8140: 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61  er view so we ca
8150: 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20  n skip the copy 
8160: 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20  step here.      
8170: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65    ** in the inne
8180: 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20  r view..        
8190: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
81a0: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
81b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
81c0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
81d0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
81e0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
81f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8200: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
8210: 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
8220: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
8230: 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
8240: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
8250: 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
8260: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
8270: 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20  in(pParse, p) ) 
8280: 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
8290: 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
82a0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
82b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
82c0: 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
82d0: 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
82e0: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
82f0: 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
8300: 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
8310: 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
8320: 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
8330: 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
8340: 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
8350: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
8360: 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
8370: 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
8380: 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
8390: 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
83a0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
83b0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
83c0: 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
83d0: 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
83e0: 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
83f0: 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
8400: 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
8410: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
8420: 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
8430: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
8440: 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
8450: 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
8460: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
8470: 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
8480: 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
8490: 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
84a0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
84b0: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
84c0: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
84d0: 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
84e0: 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
84f0: 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
8500: 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
8510: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
8520: 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
8530: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
8540: 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
8550: 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
8560: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
8570: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
8580: 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70  c = 0;.  if( k<p
8590: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
85a0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
85b0: 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
85c0: 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
85d0: 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
85e0: 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
85f0: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
8600: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
8610: 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
8620: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
8630: 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
8640: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8650: 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
8660: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
8670: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
8680: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
8690: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
86a0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
86b0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b   0;.    for(k=0;
86c0: 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
86d0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; k++){.      Ex
86e0: 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45  pr *pE = a[k].pE
86f0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
8700: 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  E->op!=TK_ALL &&
8710: 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45 2d  .           (pE-
8720: 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
8730: 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  E->pRight==0 || 
8740: 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d  pE->pRight->op!=
8750: 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20  TK_ALL) ){.     
8760: 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
8770: 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
8780: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
8790: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
87a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
87b0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
87c0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
87d0: 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
87e0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   0);.        pNe
87f0: 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
8800: 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
8810: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
8820: 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
8830: 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
8840: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
8850: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
8860: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
8870: 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
8880: 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
8890: 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
88a0: 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
88b0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
88c0: 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
88d0: 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
88e0: 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
88f0: 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
8900: 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
8910: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
8920: 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
8930: 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
8940: 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
8950: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
8960: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
8970: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8980: 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f  n(&pE->pLeft->to
8990: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ken);.        }e
89a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
89b0: 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  TName = 0;.     
89c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
89d0: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
89e0: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
89f0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
8a00: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
8a10: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8a20: 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
8a30: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
8a40: 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d  TabName = pFrom-
8a50: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
8a60: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
8a70: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
8a80: 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  ]==0 ){ .       
8a90: 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
8aa0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
8ab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8ac0: 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
8ad0: 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c   (zTabName==0 ||
8ae0: 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20   zTabName[0]==0 
8af0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
8b00: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 49       sqlite3StrI
8b10: 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
8b20: 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20 20 20  Name)!=0) ){.   
8b30: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
8b40: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
8b50: 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
8b60: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
8b70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
8b80: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
8b90: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
8ba0: 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66 74 2c 20  *pExpr, *pLeft, 
8bb0: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
8bc0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8bd0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
8be0: 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
8bf0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
8c10: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
8c20: 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62  m *pLeft = &pTab
8c30: 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20  List->a[i-1];.  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8c50: 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65  (pLeft->jointype
8c60: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
8c70: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
8c90: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
8ca0: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
8cb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8cc0: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
8cd0: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
8ce0: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
8cf0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
8d00: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
8d10: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
8d20: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
8d30: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8d40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8d50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
8d60: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
8d70: 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20  (pLeft->pUsing, 
8d80: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8da0: 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
8db0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
8dc0: 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
8dd0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
8de0: 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
8df0: 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
8e00: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
8e10: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
8e20: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8e30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8e40: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8e50: 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
8e60: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
8e70: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
8e80: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
8e90: 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ght==0 ) break;.
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
8eb0: 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f  oken(&pRight->to
8ec0: 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ken, zName);.   
8ed0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
8ee0: 62 4e 61 6d 65 20 26 26 20 70 54 61 62 4c 69 73  bName && pTabLis
8ef0: 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
8f00: 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
8f10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
8f20: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
8f40: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8f50: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
8f60: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
8f70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8f80: 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Expr==0 ) break;
8f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8fa0: 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e  etToken(&pLeft->
8fb0: 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
8fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8fd0: 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
8fe0: 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50  >span, sqlite3MP
8ff0: 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c 20 7a  rintf("%s.%s", z
9000: 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29  TabName, zName))
9010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9020: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
9030: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
9040: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
9050: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  z = 0;.         
9060: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
9070: 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.n = 0;.       
9080: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
9090: 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20  ken.dyn = 0;.   
90a0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
90c0: 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
90e0: 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72 2d  r->span = pExpr-
90f0: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
9100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9110: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
9120: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
9130: 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69  New, pExpr, &pRi
9140: 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  ght->token);.   
9150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9160: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
9170: 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20  tableSeen ){.   
9180: 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
9190: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
91a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
91b0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
91c0: 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54  h table: %s", zT
91d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
91e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
91f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9200: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
9210: 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64  tables specified
9220: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
9230: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
9240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9250: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9260: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  TName);.      }.
9270: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9280: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9290: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
92a0: 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
92b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
92c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
92d0: 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c  utine recursivel
92e0: 79 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 53 65  y unlinks the Se
92f0: 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d 2e 70 54  lect.pSrc.a[].pT
9300: 61 62 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 69  ab pointers.** i
9310: 6e 20 61 20 73 65 6c 65 63 74 20 73 74 72 75 63  n a select struc
9320: 74 75 72 65 2e 20 20 49 74 20 6a 75 73 74 20 73  ture.  It just s
9330: 65 74 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ets the pointers
9340: 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 0a   to NULL.  This.
9350: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ** routine is re
9360: 63 75 72 73 69 76 65 20 69 6e 20 74 68 65 20 73  cursive in the s
9370: 65 6e 73 65 20 74 68 61 74 20 69 66 20 74 68 65  ense that if the
9380: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 61 5b 5d   Select.pSrc.a[]
9390: 2e 70 53 65 6c 65 63 74 0a 2a 2a 20 70 6f 69 6e  .pSelect.** poin
93a0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ter is not NULL,
93b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
93c0: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
93d0: 65 6c 79 20 6f 6e 20 74 68 61 74 20 70 6f 69 6e  ely on that poin
93e0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
93f0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9400: 64 20 6f 6e 20 74 68 65 20 53 65 6c 65 63 74 20  d on the Select 
9410: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
9420: 65 66 69 6e 65 73 20 61 0a 2a 2a 20 56 49 45 57  efines a.** VIEW
9430: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 75 6e 64   in order to und
9440: 6f 20 61 6e 79 20 62 69 6e 64 69 6e 67 73 20 74  o any bindings t
9450: 6f 20 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20  o tables.  This 
9460: 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
9470: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 74 61  because those ta
9480: 62 6c 65 73 20 6d 69 67 68 74 20 62 65 20 44 52  bles might be DR
9490: 4f 50 65 64 20 62 79 20 61 20 73 75 62 73 65 71  OPed by a subseq
94a0: 75 65 6e 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  uent SQL command
94b0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 62 69 6e 64  ..** If the bind
94c0: 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 72 65 6d  ings are not rem
94d0: 6f 76 65 64 2c 20 74 68 65 6e 20 74 68 65 20 53  oved, then the S
94e0: 65 6c 65 63 74 2e 70 53 72 63 2d 3e 61 5b 5d 2e  elect.pSrc->a[].
94f0: 70 54 61 62 20 66 69 65 6c 64 0a 2a 2a 20 77 69  pTab field.** wi
9500: 6c 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74  ll be left point
9510: 69 6e 67 20 74 6f 20 61 20 64 65 61 6c 6c 6f 63  ing to a dealloc
9520: 61 74 65 64 20 54 61 62 6c 65 20 73 74 72 75 63  ated Table struc
9530: 74 75 72 65 20 61 66 74 65 72 20 74 68 65 0a 2a  ture after the.*
9540: 2a 20 44 52 4f 50 20 61 6e 64 20 61 20 63 6f 72  * DROP and a cor
9550: 65 64 75 6d 70 20 77 69 6c 6c 20 6f 63 63 75 72  edump will occur
9560: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
9570: 68 65 20 56 49 45 57 20 69 73 20 75 73 65 64 2e  he VIEW is used.
9580: 0a 2a 2f 0a 23 69 66 20 30 0a 76 6f 69 64 20 73  .*/.#if 0.void s
9590: 71 6c 69 74 65 33 53 65 6c 65 63 74 55 6e 62 69  qlite3SelectUnbi
95a0: 6e 64 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  nd(Select *p){. 
95b0: 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
95c0: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
95d0: 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
95e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
95f0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
9600: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
9610: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  urn;.  for(i=0, 
9620: 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
9630: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
9640: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9650: 69 66 28 20 28 70 54 61 62 20 3d 20 70 49 74 65  if( (pTab = pIte
9660: 6d 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b 0a 20  m->pTab)!=0 ){. 
9670: 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69       if( pTab->i
9680: 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20 20  sTransient ){.  
9690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
96a0: 65 74 65 54 61 62 6c 65 28 30 2c 20 70 54 61 62  eteTable(0, pTab
96b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
96c0: 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30   pItem->pTab = 0
96d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
96e0: 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
96f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
9700: 65 63 74 55 6e 62 69 6e 64 28 70 49 74 65 6d 2d  ectUnbind(pItem-
9710: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
9720: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
9730: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
9740: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
9750: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
9760: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
9770: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
9780: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
9790: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
97a0: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
97b0: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
97c0: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
97d0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
97e0: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
97f0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
9800: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
9810: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
9820: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
9830: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
9840: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
9850: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
9860: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
9870: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
9880: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
9890: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
98a0: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
98b0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
98c0: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
98d0: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
98e0: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
98f0: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
9900: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
9910: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
9920: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
9930: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
9940: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
9950: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
9960: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
9970: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
9980: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
9990: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
99a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
99b0: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
99c0: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
99d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
99e0: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
99f0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
9a00: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
9a10: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
9a20: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
9a30: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
9a40: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
9a50: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9a60: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
9a70: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
9a80: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
9a90: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
9aa0: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
9ab0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
9ac0: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
9ad0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
9ae0: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
9af0: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
9b00: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
9b10: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
9b20: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
9b30: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
9b40: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
9b50: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
9b60: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
9b70: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
9b80: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
9b90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
9ba0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
9bb0: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
9bc0: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
9bd0: 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  }.  if( prepSele
9be0: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
9bf0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
9c00: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
9c10: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
9c20: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
9c30: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
9c40: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
9c50: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
9c60: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
9c70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c80: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
9c90: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
9ca0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
9cb0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
9cc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9cd0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
9ce0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
9cf0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
9d00: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
9d10: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
9d20: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
9d30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9d40: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
9d50: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
9d60: 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
9d70: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
9d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9d90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9da0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f  se,.          "O
9db0: 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e  RDER BY position
9dc0: 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65   %d should be be
9dd0: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
9de0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c  .          iCol,
9df0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
9e00: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
9e10: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9e30: 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  ( !mustComplete 
9e40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9e50: 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a    iCol--;.    }.
9e60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f      for(j=0; iCo
9e70: 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d  l<0 && j<pEList-
9e80: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
9e90: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
9ea0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
9eb0: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
9ec0: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
9ed0: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
9ee0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62  ar *zName, *zLab
9ef0: 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  el;.        zNam
9f00: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  e = pEList->a[j]
9f10: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
9f20: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
9f30: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
9f40: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  E->token);.     
9f50: 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65     assert( zLabe
9f60: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
9f70: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
9f80: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
9f90: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
9fa0: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
9fb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9fc0: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
9fd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9fe0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
9ff0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
a000: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
a010: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
a020: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
a030: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a040: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
a050: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
a060: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
a070: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
a080: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
a090: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
a0a0: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
a0b0: 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  -1;.      pOrder
a0c0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
a0d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
a0e0: 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43   iCol<0 && mustC
a0f0: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
a100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a110: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
a120: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
a130: 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e  number %d does n
a140: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73  ot match any res
a150: 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31  ult column", i+1
a160: 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  );.      nErr++;
a170: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a190: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
a1a0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
a1b0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
a1c0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
a1d0: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
a1e0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
a1f0: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
a200: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
a210: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
a220: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a230: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
a240: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
a250: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
a260: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
a270: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
a280: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
a290: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a2a0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
a2b0: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
a2c0: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
a2d0: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
a2e0: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
a2f0: 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn v;.}../*.** C
a300: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
a310: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
a320: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
a330: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
a340: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
a350: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
a360: 73 2e 20 20 6e 4c 69 6d 69 74 20 61 6e 64 20 6e  s.  nLimit and n
a370: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
a380: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
a390: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
a3a0: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
a3b0: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
a3c0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
a3d0: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
a3e0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
a3f0: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
a400: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
a410: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
a420: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
a430: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
a440: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
a450: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
a460: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
a470: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
a480: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
a490: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
a4a0: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
a4b0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
a4c0: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
a4d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a4e0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
a4f0: 75 65 73 20 69 66 20 69 4c 69 6d 69 74 20 61 6e  ues if iLimit an
a500: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
a510: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
a520: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
a530: 64 20 62 79 20 6e 4c 69 6d 69 74 20 61 6e 64 20  d by nLimit and 
a540: 6e 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  nOffset.  iLimit
a550: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
a560: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
a570: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
a580: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
a590: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
a5a0: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
a5b0: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
a5c0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
a5d0: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 6e  ne..** Only if n
a5e0: 4c 69 6d 69 74 3e 3d 30 20 6f 72 20 6e 4f 66 66  Limit>=0 or nOff
a5f0: 73 65 74 3e 30 20 64 6f 20 74 68 65 20 6c 69 6d  set>0 do the lim
a600: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
a610: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
a620: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
a630: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
a640: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
a650: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
a660: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
a670: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
a680: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
a690: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
a6a0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
a6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
a6c0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
a6d0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
a6e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 2f   Select *p){.  /
a6f0: 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
a700: 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
a710: 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
a720: 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
a730: 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20  ntraversy about 
a740: 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
a750: 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
a760: 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
a770: 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
a780: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
a790: 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
a7a0: 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
a7b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c    */.  if( p->pL
a7c0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
a7d0: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
a7e0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64 62 65 20  Mem++;.    Vdbe 
a7f0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
a800: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
a810: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
a820: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
a830: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
a840: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
a850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a860: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
a870: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
a880: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a890: 20 4f 50 5f 4e 65 67 61 74 69 76 65 2c 20 30 2c   OP_Negative, 0,
a8a0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a8b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a8c0: 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20  MemStore, iMem, 
a8d0: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
a8e0: 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54  ent((v, "# LIMIT
a8f0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
a900: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4d 65   p->iLimit = iMe
a910: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  m;.  }.  if( p->
a920: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 69  pOffset ){.    i
a930: 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  nt iMem = pParse
a940: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 56 64  ->nMem++;.    Vd
a950: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a960: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a970: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
a980: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
a990: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a9a0: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  e, p->pOffset);.
a9b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
a9d0: 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eInt, 0, 0);.   
a9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9f0: 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76 65  p(v, OP_Negative
aa00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
aa10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aa20: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d   OP_MemStore, iM
aa30: 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  em, 1);.    Vdbe
aa40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4f  Comment((v, "# O
aa50: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
aa60: 3b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  ;.    p->iOffset
aa70: 20 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 7d 0a 0a   = iMem;.  }.}..
aa80: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
aa90: 44 42 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  DBE instructions
aaa0: 20 74 68 61 74 20 77 69 6c 6c 20 6f 70 65 6e 20   that will open 
aab0: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
aac0: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
aad0: 65 20 75 73 65 64 20 66 6f 72 20 61 6e 20 69 6e  e used for an in
aae0: 64 65 78 20 6f 72 20 74 6f 20 73 74 6f 72 65 20  dex or to store 
aaf0: 6b 65 79 65 64 20 72 65 73 75 6c 74 73 20 66 6f  keyed results fo
ab00: 72 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  r a compound.** 
ab10: 73 65 6c 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  select.  In othe
ab20: 72 20 77 6f 72 64 73 2c 20 6f 70 65 6e 20 61 20  r words, open a 
ab30: 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
ab40: 74 68 61 74 20 6e 65 65 64 73 20 61 0a 2a 2a 20  that needs a.** 
ab50: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
ab60: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
ab70: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
ab80: 20 4b 65 79 49 6e 66 6f 20 69 73 20 64 65 74 65   KeyInfo is dete
ab90: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
aba0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
abb0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
abc0: 65 6e 74 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ent in the secon
abd0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
abe0: 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  * Specifically, 
abf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
ac00: 63 61 6c 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61  called to open a
ac10: 6e 20 69 6e 64 65 78 20 74 61 62 6c 65 20 66 6f  n index table fo
ac20: 72 0a 2a 2a 20 44 49 53 54 49 4e 43 54 2c 20 55  r.** DISTINCT, U
ac30: 4e 49 4f 4e 2c 20 49 4e 54 45 52 53 45 43 54 20  NION, INTERSECT 
ac40: 61 6e 64 20 45 58 43 45 50 54 20 73 65 6c 65 63  and EXCEPT selec
ac50: 74 20 73 74 61 74 65 6d 65 6e 74 73 20 28 62 75  t statements (bu
ac60: 74 20 6e 6f 74 20 0a 2a 2a 20 55 4e 49 4f 4e 20  t not .** UNION 
ac70: 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6b 65  ALL)..**.** Make
ac80: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 61   the new table a
ac90: 20 4b 65 79 41 73 44 61 74 61 20 74 61 62 6c 65   KeyAsData table
aca0: 20 69 66 20 6b 65 79 41 73 44 61 74 61 20 69 73   if keyAsData is
acb0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   true..**.** The
acc0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
acd0: 69 73 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  is the address o
ace0: 66 20 74 68 65 20 4f 50 5f 4f 70 65 6e 54 65 6d  f the OP_OpenTem
acf0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  p instruction..*
ad00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
ad10: 6e 54 65 6d 70 49 6e 64 65 78 28 50 61 72 73 65  nTempIndex(Parse
ad20: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
ad30: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 69   *p, int iTab, i
ad40: 6e 74 20 6b 65 79 41 73 44 61 74 61 29 7b 0a 20  nt keyAsData){. 
ad50: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
ad60: 66 6f 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d  fo;.  int nColum
ad70: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
ad80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ad90: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a   int i;.  Vdbe *
ada0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
adb0: 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
adc0: 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
add0: 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
ade0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
adf0: 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  .  }.  nColumn =
ae00: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
ae10: 72 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  r;.  pKeyInfo = 
ae20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
ae30: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
ae40: 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66 28 43  nColumn*sizeof(C
ae50: 6f 6c 6c 53 65 71 2a 29 20 29 3b 0a 20 20 69 66  ollSeq*) );.  if
ae60: 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 20  ( pKeyInfo==0 ) 
ae70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4b 65 79  return 0;.  pKey
ae80: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 64 62 2d 3e  Info->enc = db->
ae90: 65 6e 63 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d  enc;.  pKeyInfo-
aea0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 75 6d  >nField = nColum
aeb0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
aec0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
aed0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
aee0: 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[i] = sqlite3E
aef0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
af00: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
af10: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
af20: 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  f( !pKeyInfo->aC
af30: 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
af40: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
af50: 69 5d 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  i] = db->pDfltCo
af60: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ll;.    }.  }.  
af70: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
af80: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
af90: 54 65 6d 70 2c 20 69 54 61 62 2c 20 30 2c 20 0a  Temp, iTab, 0, .
afa0: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
afb0: 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
afc0: 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 69 66  O_HANDOFF);.  if
afd0: 28 20 6b 65 79 41 73 44 61 74 61 20 29 7b 0a 20  ( keyAsData ){. 
afe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aff0: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
b000: 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20  ata, iTab, 1);. 
b010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
b020: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
b030: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b040: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 41  D_SELECT./*.** A
b050: 64 64 20 74 68 65 20 61 64 64 72 65 73 73 20 22  dd the address "
b060: 61 64 64 72 22 20 74 6f 20 74 68 65 20 73 65 74  addr" to the set
b070: 20 6f 66 20 61 6c 6c 20 4f 70 65 6e 54 65 6d 70   of all OpenTemp
b080: 20 6f 70 63 6f 64 65 20 61 64 64 72 65 73 73 65   opcode addresse
b090: 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 62 65  s.** that are be
b0a0: 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 65 64 20  ing accumulated 
b0b0: 69 6e 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  in p->ppOpenTemp
b0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b0d0: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54  multiSelectOpenT
b0e0: 65 6d 70 41 64 64 72 28 53 65 6c 65 63 74 20 2a  empAddr(Select *
b0f0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
b100: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
b110: 2a 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d  *p->ppOpenTemp =
b120: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
b130: 70 65 6e 64 28 2a 70 2d 3e 70 70 4f 70 65 6e 54  pend(*p->ppOpenT
b140: 65 6d 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  emp, 0);.  if( p
b150: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  List==0 ){.    r
b160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
b170: 45 4d 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d  EM;.  }.  pList-
b180: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 49 64 2d 31 5d  >a[pList->nId-1]
b190: 2e 69 64 78 20 3d 20 61 64 64 72 3b 0a 20 20 72  .idx = addr;.  r
b1a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b1b0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b1c0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b1d0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66  D_SELECT */..#if
b1e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b1f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b200: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b210: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f  e appropriate co
b220: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b230: 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68   for the iCol-th
b240: 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
b250: 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72  e result set for
b260: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65   the compound-se
b270: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22  lect statement "
b280: 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  p".  Return NULL
b290: 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   if.** the colum
b2a0: 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74  n has no default
b2b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b2c0: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  nce..**.** The c
b2d0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
b2e0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  e for the compou
b2f0: 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b  nd select is tak
b300: 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c  en from the.** l
b310: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
b320: 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74   the select that
b330: 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67   has a collating
b340: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
b350: 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75  atic CollSeq *mu
b360: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
b370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b380: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
b390: 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  Col){.  CollSeq 
b3a0: 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e  *pRet;.  if( p->
b3b0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52  pPrior ){.    pR
b3c0: 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  et = multiSelect
b3d0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b3e0: 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29  p->pPrior, iCol)
b3f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b400: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  Ret = 0;.  }.  i
b410: 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( pRet==0 ){.  
b420: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
b430: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
b440: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
b450: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
b460: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
b470: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b480: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
b490: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
b4a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b4b0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
b4c0: 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
b4d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
b4e0: 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65 72  o process a quer
b4f0: 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79  y that is really
b500: 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72   the union.** or
b510: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
b520: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
b530: 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a  arate queries..*
b540: 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
b550: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
b560: 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
b570: 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
b580: 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
b590: 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
b5a0: 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
b5b0: 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
b5c0: 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
b5d0: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
b5e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
b5f0: 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
b600: 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
b610: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
b620: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
b630: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
b640: 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
b650: 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
b660: 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
b670: 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
b680: 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
b690: 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
b6a0: 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
b6b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
b6c0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
b6d0: 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
b6e0: 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
b6f0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
b700: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
b710: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
b720: 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
b730: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
b740: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
b750: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
b760: 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
b770: 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
b780: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
b7a0: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
b7b0: 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
b7c0: 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
b7d0: 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
b7e0: 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
b7f0: 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
b800: 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
b810: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b820: 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
b830: 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
b840: 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
b850: 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
b860: 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
b870: 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
b880: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
b890: 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
b8a0: 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
b8b0: 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
b8c0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
b8d0: 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
b8e0: 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
b8f0: 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
b900: 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
b910: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
b920: 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
b930: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
b940: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b950: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
b960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b970: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b980: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
b990: 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44  oded */.  int eD
b9a0: 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  est,            
b9b0: 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71  /* \___  Store q
b9c0: 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73 20  uery results as 
b9d0: 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69  specified */.  i
b9e0: 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20  nt iParm,       
b9f0: 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79       /* /     by
ba00: 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d   these two param
ba10: 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a  eters.         *
ba20: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
ba30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ba40: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
ba50: 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
ba60: 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
ba70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ba80: 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
ba90: 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
baa0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
bab0: 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
bac0: 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
bad0: 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
bae0: 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
baf0: 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
bb00: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
bb10: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
bb20: 20 56 44 42 45 20 2a 2f 0a 20 20 49 64 4c 69 73   VDBE */.  IdLis
bb30: 74 20 2a 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30  t *pOpenTemp = 0
bb40: 3b 2f 2a 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20  ;/* OP_OpenTemp 
bb50: 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6e 65 65  opcodes that nee
bb60: 64 20 61 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20  d a KeyInfo */. 
bb70: 20 69 6e 74 20 61 41 64 64 72 5b 35 5d 3b 20 20   int aAddr[5];  
bb80: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
bb90: 73 65 73 20 6f 66 20 53 65 74 4e 75 6d 43 6f 6c  ses of SetNumCol
bba0: 75 6d 6e 73 20 6f 70 65 72 61 74 6f 72 73 20 2a  umns operators *
bbb0: 2f 0a 20 20 69 6e 74 20 6e 41 64 64 72 20 3d 20  /.  int nAddr = 
bbc0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  0;        /* Num
bbd0: 62 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e  ber used */.  in
bbe0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
bbf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bc00: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
bc10: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
bc20: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
bc30: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
bc40: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
bc50: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
bc60: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
bc70: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
bc80: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
bc90: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
bca0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
bcb0: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
bcc0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
bcd0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
bce0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
bcf0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bd00: 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  nd;.  }.  pPrior
bd10: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
bd20: 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
bd30: 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
bd40: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
bd50: 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
bd60: 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
bd70: 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
bd80: 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
bd90: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
bda0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
bdb0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
bdc0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
bdd0: 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
bde0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
bdf0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
be00: 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
be10: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
be20: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
be30: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
be40: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
be50: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
be60: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
be70: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
be80: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 61  e sure we have a
be90: 20 76 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67   valid query eng
bea0: 69 6e 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72  ine.  If not, cr
beb0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
bec0: 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
bed0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
bee0: 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
bef0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
bf00: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
bf10: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
bf20: 2a 20 49 66 20 2a 70 20 74 68 69 73 20 69 73 20  * If *p this is 
bf30: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
bf40: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2c  elect statement,
bf50: 20 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   then initialize
bf60: 0a 20 20 2a 2a 20 70 2d 3e 70 70 4f 70 65 6e 54  .  ** p->ppOpenT
bf70: 65 6d 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  emp to point to 
bf80: 70 4f 70 65 6e 54 65 6d 70 2e 20 20 49 66 20 2a  pOpenTemp.  If *
bf90: 70 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  p is not the rig
bfa0: 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73 74 61  ht most.  ** sta
bfb0: 74 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d 3e 70  tement then p->p
bfc0: 70 4f 70 65 6e 54 65 6d 70 20 77 69 6c 6c 20 68  pOpenTemp will h
bfd0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
bfe0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 20 20 2a   initialized.  *
bff0: 2a 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c  * by a prior cal
c000: 6c 20 74 6f 20 74 68 69 73 20 73 61 6d 65 20 70  l to this same p
c010: 72 6f 63 65 64 75 72 65 2e 20 20 50 61 73 73 20  rocedure.  Pass 
c020: 61 6c 6f 6e 67 20 74 68 65 20 70 4f 70 65 6e 54  along the pOpenT
c030: 65 6d 70 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  emp.  ** pointer
c040: 20 74 6f 20 70 50 72 69 6f 72 2c 20 74 68 65 20   to pPrior, the 
c050: 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 74  next statement t
c060: 6f 20 6f 75 72 20 6c 65 66 74 2e 0a 20 20 2a 2f  o our left..  */
c070: 0a 20 20 69 66 28 20 70 2d 3e 70 70 4f 70 65 6e  .  if( p->ppOpen
c080: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Temp==0 ){.    p
c090: 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 26  ->ppOpenTemp = &
c0a0: 70 4f 70 65 6e 54 65 6d 70 3b 0a 20 20 7d 0a 20  pOpenTemp;.  }. 
c0b0: 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e 54   pPrior->ppOpenT
c0c0: 65 6d 70 20 3d 20 70 2d 3e 70 70 4f 70 65 6e 54  emp = p->ppOpenT
c0d0: 65 6d 70 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  emp;..  /* Creat
c0e0: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
c0f0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c100: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
c110: 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
c120: 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c 65 20 29  =SRT_TempTable )
c130: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
c140: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
c150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c160: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
c170: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 61  iParm, 0);.    a
c180: 73 73 65 72 74 28 20 6e 41 64 64 72 3d 3d 30 20  ssert( nAddr==0 
c190: 29 3b 0a 20 20 20 20 61 41 64 64 72 5b 6e 41 64  );.    aAddr[nAd
c1a0: 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56  dr++] = sqlite3V
c1b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
c1c0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 50  etNumColumns, iP
c1d0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65  arm, 0);.    eDe
c1e0: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
c1f0: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
c200: 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
c210: 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
c220: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
c230: 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
c240: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
c250: 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
c260: 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
c270: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  By==0 ){.       
c280: 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
c290: 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20  ->pLimit );.    
c2a0: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d      pPrior->pLim
c2b0: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
c2c0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
c2d0: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
c2e0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63  fset;.        rc
c2f0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c300: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
c310: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
c320: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
c330: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
c340: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
c350: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c360: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c370: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
c380: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
c390: 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
c3a0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
c3b0: 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
c3c0: 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
c3d0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
c3e0: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  0;.        p->pO
c3f0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
c400: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
c410: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
c420: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
c430: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
c440: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
c450: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
c460: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c470: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c480: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
c4a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c4b0: 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e      /* For UNION
c4c0: 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42   ALL ... ORDER B
c4d0: 59 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  Y fall through t
c4e0: 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 20  o the next case 
c4f0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
c500: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
c510: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
c520: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
c530: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
c540: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
c550: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c560: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
c570: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  */.      int op 
c580: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65  = 0;      /* One
c590: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
c5a0: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
c5b0: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
c5c0: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
c5d0: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
c5e0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
c5f0: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
c600: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
c610: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
c620: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
c630: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
c640: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
c650: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
c660: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
c670: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
c680: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
c690: 72 69 67 68 74 20 53 45 4c 45 43 54 20 2a 2f 0a  right SELECT */.
c6a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c6b0: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
c6c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f   p->op==TK_ALL ?
c6d0: 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54   SRT_Table : SRT
c6e0: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
c6f0: 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  ( eDest==priorOp
c700: 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d   && p->pOrderBy=
c710: 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74  =0 && !p->pLimit
c720: 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20   && !p->pOffset 
c730: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
c740: 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
c750: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
c760: 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
c770: 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
c780: 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
c790: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
c7a0: 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b  nionTab = iParm;
c7b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c7c0: 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
c7d0: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
c7e0: 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
c7f0: 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
c800: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
c810: 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
c820: 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
c830: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
c840: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
c850: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  +;.        if( p
c860: 2d 3e 70 4f 72 64 65 72 42 79 20 0a 20 20 20 20  ->pOrderBy .    
c870: 20 20 20 20 26 26 20 6d 61 74 63 68 4f 72 64 65      && matchOrde
c880: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
c890: 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
c8a0: 42 79 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 31 29  By, unionTab, 1)
c8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
c8c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
c8d0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c8e0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
c8f0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
c900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c910: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
c920: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
c930: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
c940: 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
c950: 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69        rc = multi
c960: 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64  SelectOpenTempAd
c970: 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20  dr(p, addr);.   
c980: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
c990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c9a0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c9b0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c9c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c9d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c9e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
c9f0: 73 44 61 74 61 2c 20 75 6e 69 6f 6e 54 61 62 2c  sData, unionTab,
ca00: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 09   1);.        }..
ca10: 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73 69  assert( nAddr<si
ca20: 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a 65  zeof(aAddr)/size
ca30: 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b 0a  of(aAddr[0]) );.
ca40: 20 20 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41          aAddr[nA
ca50: 64 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  ddr++] = sqlite3
ca60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ca70: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 75  SetNumColumns, u
ca80: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
ca90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
caa0: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
cab0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
cac0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cad0: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
cae0: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
caf0: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
cb00: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
cb10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cb20: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
cb30: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
cb40: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
cb50: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
cb60: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cb70: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
cb80: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
cb90: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
cba0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
cbb0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
cbc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
cbd0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
cbe0: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
cbf0: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
cc00: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
cc10: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
cc20: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
cc30: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
cc40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
cc50: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
cc60: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
cc70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
cc80: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
cc90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 72 64   = 0;.      pOrd
cca0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
ccb0: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  By;.      p->pOr
ccc0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
ccd0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
cce0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
ccf0: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
cd00: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
cd10: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
cd20: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
cd30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
cd40: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
cd50: 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  op, unionTab, 0,
cd60: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
cd70: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
cd80: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
cd90: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
cda0: 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rBy;.      sqlit
cdb0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
cdc0: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
cdd0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
cde0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
cdf0: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
ce00: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
ce10: 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f   -1;.      p->iO
ce20: 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20  ffset = -1;.    
ce30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
ce40: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
ce50: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
ce60: 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
ce70: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
ce80: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
ce90: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
cea0: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
ceb0: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
cec0: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
ced0: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
cee0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21 3d       if( eDest!=
cef0: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
cf00: 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20  Tab!=iParm ){.  
cf10: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
cf20: 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
cf30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cf40: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
cf50: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
cf60: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
cf70: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
cf80: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
cf90: 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c  Parse, 0, p->pEL
cfa0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
cfb0: 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
cfc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
cfd0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
cfe0: 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
cff0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d000: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d010: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d020: 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
d030: 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
d040: 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
d050: 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
d060: 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69  e, p);.        i
d070: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
d080: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d090: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
d0a0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
d0b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
d0c0: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
d0d0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d0e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d100: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20  ->pOrderBy, -1, 
d110: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
d140: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
d150: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
d160: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
d170: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
d180: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d190: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
d1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d1b0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d1c0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
d1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d1e0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  p(v, OP_Next, un
d1f0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
d200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d210: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d220: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
d230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
d250: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
d260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
d270: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d280: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
d290: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
d2a0: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
d2b0: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
d2c0: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
d2d0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
d2e0: 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
d2f0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
d300: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
d310: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
d320: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
d330: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
d340: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
d350: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
d360: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
d370: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
d380: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
d390: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
d3a0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
d3b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
d3c0: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
d3d0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
d3e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d3f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
d400: 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63 68  OrderBy && match
d410: 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28  OrderbyToColumn(
d420: 70 50 61 72 73 65 2c 70 2c 70 2d 3e 70 4f 72 64  pParse,p,p->pOrd
d430: 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a  erBy,tab1,1) ){.
d440: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
d450: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d460: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d470: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 64       }..      ad
d480: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d490: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
d4a0: 54 65 6d 70 2c 20 74 61 62 31 2c 20 30 29 3b 0a  Temp, tab1, 0);.
d4b0: 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69        rc = multi
d4c0: 53 65 6c 65 63 74 4f 70 65 6e 54 65 6d 70 41 64  SelectOpenTempAd
d4d0: 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20  dr(p, addr);.   
d4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d4f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d500: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d510: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
d520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
d540: 73 44 61 74 61 2c 20 74 61 62 31 2c 20 31 29 3b  sData, tab1, 1);
d550: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
d560: 41 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64  Addr<sizeof(aAdd
d570: 72 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b  r)/sizeof(aAddr[
d580: 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 61 41 64  0]) );.      aAd
d590: 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73 71  dr[nAddr++] = sq
d5a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d5b0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
d5c0: 6e 73 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  ns, tab1, 0);.  
d5d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
d5e0: 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
d5f0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
d600: 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
d610: 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
d620: 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
d630: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
d640: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
d650: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53  Parse, pPrior, S
d660: 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20  RT_Union, tab1, 
d670: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
d680: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d690: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d6a0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d6b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d6c0: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
d6d0: 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
d6e0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d6f0: 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
d700: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d710: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d720: 5f 4f 70 65 6e 54 65 6d 70 2c 20 74 61 62 32 2c  _OpenTemp, tab2,
d730: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
d740: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 70 65 6e 54  multiSelectOpenT
d750: 65 6d 70 41 64 64 72 28 70 2c 20 61 64 64 72 29  empAddr(p, addr)
d760: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d770: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d780: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d790: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d7a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
d7b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d7c0: 5f 4b 65 79 41 73 44 61 74 61 2c 20 74 61 62 32  _KeyAsData, tab2
d7d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
d7e0: 72 74 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66  rt( nAddr<sizeof
d7f0: 28 61 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61  (aAddr)/sizeof(a
d800: 41 64 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Addr[0]) );.    
d810: 20 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d    aAddr[nAddr++]
d820: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d830: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d  dOp(v, OP_SetNum
d840: 43 6f 6c 75 6d 6e 73 2c 20 74 61 62 32 2c 20 30  Columns, tab2, 0
d850: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
d860: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
d870: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
d880: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
d890: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
d8a0: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
d8b0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d8c0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
d8d0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d8e0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
d8f0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
d900: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d910: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d920: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
d930: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
d940: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
d950: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
d960: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
d970: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
d980: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
d990: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
d9a0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d9b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d9c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d9d0: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
d9e0: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
d9f0: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
da00: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
da10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
da20: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
da30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
da40: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
da50: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65   ){.        gene
da60: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
da70: 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45  pParse, 0, p->pE
da80: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
da90: 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
daa0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
dab0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f  el(v);.      iCo
dac0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
dad0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
dae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
daf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
db00: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
db10: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
db20: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
db30: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
db40: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
db50: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
db60: 46 75 6c 6c 4b 65 79 2c 20 74 61 62 31 2c 20 30  FullKey, tab1, 0
db70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
db80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
db90: 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
dba0: 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  iCont);.      rc
dbb0: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
dbc0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
dbd0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
dbe0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
dbf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
dc10: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65  >pOrderBy, -1, e
dc20: 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74             iCont
dc50: 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20  , iBreak, 0);.  
dc60: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
dc70: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
dc80: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
dc90: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
dca0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
dcb0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
dcc0: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
dcd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dce0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
dcf0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
dd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
dd20: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
dd30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dd40: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
dd50: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
dd60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
dd70: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31  , OP_Close, tab1
dd80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
dd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
dda0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
ddb0: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
ddc0: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
ddd0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
dde0: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
ddf0: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
de00: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
de10: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
de20: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
de30: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
de40: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
de50: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
de60: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
de70: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
de80: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
de90: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
dea0: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
deb0: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
dec0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
ded0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
dee0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
def0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
df00: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
df10: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
df20: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
df30: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
df40: 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
df50: 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20  les.  */.  nCol 
df60: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
df70: 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e 41 64  pr;.  while( nAd
df80: 64 72 3e 30 20 29 7b 0a 20 20 20 20 6e 41 64 64  dr>0 ){.    nAdd
df90: 72 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r--;.    sqlite3
dfa0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
dfb0: 61 41 64 64 72 5b 6e 41 64 64 72 5d 2c 20 6e 43  aAddr[nAddr], nC
dfc0: 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ol);.  }..  /* C
dfd0: 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
dfe0: 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
dff0: 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f 52  by either the OR
e000: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
e010: 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d  .  ** by any tem
e020: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65  porary tables ne
e030: 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  eded to implemen
e040: 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  t the compound s
e050: 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61  elect..  ** Atta
e060: 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ch the KeyInfo s
e070: 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20  tructure to all 
e080: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
e090: 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20  .  Invoke the.  
e0a0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f 63  ** ORDER BY proc
e0b0: 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65 20  essing if there 
e0c0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
e0d0: 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lause..  **.  **
e0e0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
e0f0: 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
e100: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
e110: 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
e120: 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
e130: 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
e140: 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
e150: 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
e160: 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
e170: 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
e180: 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
e190: 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
e1a0: 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
e1b0: 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
e1c0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
e1d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e1e0: 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 4f 70 65  OrderBy || (pOpe
e1f0: 6e 54 65 6d 70 20 26 26 20 70 4f 70 65 6e 54 65  nTemp && pOpenTe
e200: 6d 70 2d 3e 6e 49 64 3e 30 29 20 29 7b 0a 20 20  mp->nId>0) ){.  
e210: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e240: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
e250: 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
e260: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
e270: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
e280: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
e290: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
e2a0: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 3d 20 26  >ppOpenTemp == &
e2b0: 70 4f 70 65 6e 54 65 6d 70 20 29 3b 0a 20 20 20  pOpenTemp );.   
e2c0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
e2d0: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
e2e0: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a  *pKeyInfo)+nCol*
e2f0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
e300: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
e310: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
e320: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e330: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
e340: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e350: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
e360: 6f 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  o->enc = pParse-
e370: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4b  >db->enc;.    pK
e380: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
e390: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
e3a0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
e3b0: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
e3c0: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  o->aColl[i] = mu
e3d0: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e3e0: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
e3f0: 20 20 20 20 20 20 69 66 28 20 21 70 4b 65 79 49        if( !pKeyI
e400: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
e410: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
e420: 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  o->aColl[i] = pP
e430: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
e440: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
e450: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
e460: 20 70 4f 70 65 6e 54 65 6d 70 20 26 26 20 69 3c   pOpenTemp && i<
e470: 70 4f 70 65 6e 54 65 6d 70 2d 3e 6e 49 64 3b 20  pOpenTemp->nId; 
e480: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
e490: 70 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f 50  p3type = (i==0?P
e4a0: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
e4b0: 46 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  F:P3_KEYINFO);. 
e4c0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
e4d0: 70 4f 70 65 6e 54 65 6d 70 2d 3e 61 5b 69 5d 2e  pOpenTemp->a[i].
e4e0: 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  idx;.      sqlit
e4f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
e500: 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20 2a 29  , addr, (char *)
e510: 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79 70 65  pKeyInfo, p3type
e520: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
e530: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
e540: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
e550: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 72  prList_item *pOr
e560: 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d 3e 70  derByTerm = p->p
e570: 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20  OrderBy->a;.    
e580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
e590: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
e5a0: 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79 54 65   i++, pOrderByTe
e5b0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
e5c0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
e5d0: 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78 70 72  derByTerm->pExpr
e5e0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
e5f0: 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72 42 79  zName = pOrderBy
e600: 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Term->zName;.   
e610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
e620: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
e630: 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  N && pExpr->iCol
e640: 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  umn<nCol );.    
e650: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
e660: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 20  pExpr->pColl ); 
e670: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
e680: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e690: 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d    pExpr->pColl =
e6a0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
e6b0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 4e  llSeq(pParse, zN
e6c0: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ame, -1);.      
e6d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e6e0: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
e6f0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  = pKeyInfo->aCol
e700: 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
e710: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
e720: 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e 65 72     }.      gener
e730: 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
e740: 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c  se, p, v, p->pEL
e750: 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
e760: 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d  t, iParm);.    }
e770: 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70 65 6e  ..    if( !pOpen
e780: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Temp ){.      /*
e790: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   This happens fo
e7a0: 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20  r UNION ALL ... 
e7b0: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
e7c0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
e7d0: 79 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  yInfo);.    }.  
e7e0: 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
e7f0: 65 6e 64 3a 0a 20 20 69 66 28 20 70 4f 70 65 6e  end:.  if( pOpen
e800: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
e810: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
e820: 70 4f 70 65 6e 54 65 6d 70 29 3b 0a 20 20 7d 0a  pOpenTemp);.  }.
e830: 20 20 70 2d 3e 70 70 4f 70 65 6e 54 65 6d 70 20    p->ppOpenTemp 
e840: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
e850: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
e860: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e870: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
e880: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e890: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61  T_VIEW./*.** Sca
e8a0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
e8b0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
e8c0: 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
e8d0: 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
e8e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
e8f0: 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
e900: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
e910: 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
e920: 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
e930: 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
e940: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
e950: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
e960: 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
e970: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e980: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
e990: 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
e9a0: 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
e9b0: 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
e9c0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e9d0: 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
e9e0: 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
e9f0: 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
ea00: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
ea10: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
ea20: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
ea30: 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
ea40: 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
ea50: 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
ea60: 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
ea70: 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
ea80: 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
ea90: 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
eaa0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
eab0: 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
eac0: 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
ead0: 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
eae0: 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
eaf0: 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
eb00: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
eb10: 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74  st(ExprList*,int
eb20: 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a  ,ExprList*);  /*
eb30: 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f   Forward Decl */
eb40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
eb50: 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20  stSelect(Select 
eb60: 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
eb70: 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64   *);  /* Forward
eb80: 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20   Decl */.static 
eb90: 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28 45  void substExpr(E
eba0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
ebb0: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
ebc0: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
ebd0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
ebe0: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
ebf0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
ec00: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
ec10: 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
ec20: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
ec30: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
ec40: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
ec50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ec60: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
ec70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
ec80: 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
ec90: 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
eca0: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
ecb0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
ecc0: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
ecd0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->pRight==0 && p
ece0: 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
ecf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  ;.      pNew = p
ed00: 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
ed10: 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a  iColumn].pExpr;.
ed20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
ed30: 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ew!=0 );.      p
ed40: 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d  Expr->op = pNew-
ed50: 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >op;.      asser
ed60: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
ed70: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
ed80: 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r->pLeft = sqlit
ed90: 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e  e3ExprDup(pNew->
eda0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73  pLeft);.      as
edb0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
edc0: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
edd0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
ede0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
edf0: 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
ee00: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
ee10: 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
ee20: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
ee30: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
ee40: 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69  istDup(pNew->pLi
ee50: 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  st);.      pExpr
ee60: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d  ->iTable = pNew-
ee70: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
ee80: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
ee90: 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  pNew->iColumn;. 
eea0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
eeb0: 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20   = pNew->iAgg;. 
eec0: 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
eed0: 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f  nCopy(&pExpr->to
eee0: 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65  ken, &pNew->toke
eef0: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
ef00: 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
ef10: 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e  r->span, &pNew->
ef20: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78  span);.      pEx
ef30: 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  pr->pSelect = sq
ef40: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
ef50: 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
ef60: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
ef70: 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
ef80: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
ef90: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 45      substExpr(pE
efa0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  xpr->pLeft, iTab
efb0: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
efc0: 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
efd0: 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
efe0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
eff0: 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70 72  ubstSelect(pExpr
f000: 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
f010: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
f020: 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 45  substExprList(pE
f030: 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
f040: 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
f050: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
f060: 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
f070: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  rList *pList, in
f080: 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69  t iTable, ExprLi
f090: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
f0a0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
f0b0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
f0c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
f0d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
f0e0: 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70 4c      substExpr(pL
f0f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
f100: 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
f110: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
f120: 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
f130: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
f140: 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
f150: 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20  *pEList){.  if( 
f160: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
f170: 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
f180: 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
f190: 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
f1a0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
f1b0: 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
f1c0: 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
f1d0: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
f1e0: 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
f1f0: 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
f200: 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61  (p->pHaving, iTa
f210: 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
f220: 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
f230: 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
f240: 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ist);.}.#endif /
f250: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f260: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
f270: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f280: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
f290: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
f2a0: 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
f2b0: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f   subqueries in o
f2c0: 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a  rder to speed.**
f2d0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20   execution.  It 
f2e0: 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
f2f0: 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
f300: 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
f310: 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  ning.** occurs..
f320: 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
f330: 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
f340: 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
f350: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
f360: 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
f370: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
f380: 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
f390: 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
f3a0: 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
f3b0: 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
f3c0: 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
f3d0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
f3e0: 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
f3f0: 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
f400: 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
f410: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
f420: 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
f430: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
f440: 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
f450: 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
f460: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
f470: 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
f480: 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
f490: 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
f4a0: 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
f4b0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
f4c0: 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
f4d0: 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
f4e0: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
f4f0: 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
f500: 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
f510: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
f520: 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
f530: 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
f540: 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
f550: 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
f560: 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
f570: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
f580: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
f590: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
f5a0: 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
f5b0: 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
f5c0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
f5d0: 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
f5e0: 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
f5f0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
f600: 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
f610: 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
f620: 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
f630: 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
f640: 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
f650: 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
f660: 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
f670: 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
f680: 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
f690: 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
f6a0: 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
f6b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f6c0: 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
f6d0: 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
f6e0: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
f6f0: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
f700: 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
f710: 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
f720: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f730: 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
f740: 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
f750: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f760: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
f770: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f780: 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
f790: 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
f7a0: 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f  ft outer join, o
f7b0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20  r.**        the 
f7c0: 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
f7d0: 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20  itself a join.  
f7e0: 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a  (Ticket #306).**
f7f0: 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
f800: 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
f810: 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
f820: 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
f830: 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
f840: 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71 75    (5)  The subqu
f850: 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
f860: 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  NCT or the outer
f870: 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
f880: 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
f890: 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
f8a0: 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
f8b0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f8c0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
f8d0: 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
f8e0: 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
f8f0: 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
f900: 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
f910: 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
f920: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  lause..**.**   (
f930: 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
f940: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
f950: 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
f960: 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
f970: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
f980: 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
f990: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
f9a0: 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
f9b0: 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
f9c0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
f9d0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
f9e0: 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
f9f0: 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
fa00: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
fa10: 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
fa20: 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
fa30: 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
fa40: 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
fa50: 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
fa60: 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
fa70: 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
fa80: 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
fa90: 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73 75  **  (12)  The su
faa0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68  bquery is not th
fab0: 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
fac0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
fad0: 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  N or the.**     
fae0: 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73 20     subquery has 
faf0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
fb00: 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63 6b    (added by tick
fb10: 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49  et #350).**.** I
fb20: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
fb30: 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
fb40: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
fb50: 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
fb60: 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
fb70: 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
fb80: 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
fb90: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
fba0: 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
fbb0: 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
fbc0: 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
fbd0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
fbe0: 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
fbf0: 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
fc00: 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
fc10: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
fc20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
fc30: 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
fc40: 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
fc50: 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
fc60: 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
fc70: 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
fc80: 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
fc90: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
fca0: 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
fcb0: 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
fcc0: 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
fcd0: 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
fce0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
fcf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fd00: 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
fd10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fd20: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
fd30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
fd40: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
fd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fd60: 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
fd70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fd80: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
fd90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
fda0: 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
fdb0: 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
fdc0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
fdd0: 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
fde0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
fdf0: 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
fe00: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
fe10: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
fe20: 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
fe30: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
fe40: 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
fe50: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
fe60: 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  */.){.  Select *
fe70: 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
fe80: 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
fe90: 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
fea0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
feb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
fec0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
fed0: 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
fee0: 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
fef0: 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
ff00: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
ff10: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70  ubquery */.  Exp
ff20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
ff30: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
ff40: 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
ff50: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
ff60: 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f  Parent;        /
ff70: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
ff80: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62  mber of the pSub
ff90: 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70   result set temp
ffa0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
ffb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ffc0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ffd0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
ffe0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fff0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
10000 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
10010 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
10020 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20  em *pSubitem;   
10030 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
10040 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
10050 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
10060 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
10070 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
10080 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ot..  */.  if( p
10090 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
100a0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
100b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
100c0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
100d0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
100e0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
100f0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
10100 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
10110 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
10120 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
10130 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
10140 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
10150 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
10160 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
10170 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
10180 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
10190 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
101a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
101b0 75 62 53 72 63 20 29 3b 0a 20 20 69 66 28 20 28  ubSrc );.  if( (
101c0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
101d0 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53  p->pLimit) || pS
101e0 75 62 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a  ub->pOffset || .
101f0 20 20 20 20 20 20 28 70 53 75 62 2d 3e 70 4c 69        (pSub->pLi
10200 6d 69 74 20 26 26 20 69 73 41 67 67 29 20 29 20  mit && isAgg) ) 
10210 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
10220 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
10230 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
10240 66 28 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69  f( pSub->isDisti
10250 6e 63 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  nct && (pSrc->nS
10260 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
10270 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
10280 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73  .  }.  if( p->is
10290 44 69 73 74 69 6e 63 74 20 26 26 20 73 75 62 71  Distinct && subq
102a0 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
102b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70  rn 0;.  if( p->p
102c0 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
102d0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
102e0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74  rn 0;..  /* Rest
102f0 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74  riction 3:  If t
10300 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
10310 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
10320 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10330 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20   .  ** not used 
10340 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  as the right ope
10350 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72  rand of an outer
10360 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73   join.  Examples
10370 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a   of why this.  *
10380 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  * is not allowed
10390 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
103a0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
103b0 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20  R JOIN (t2 JOIN 
103c0 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  t3).  **.  ** If
103d0 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
103e0 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
103f0 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
10400 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
10410 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f  UTER JOIN t2) JO
10420 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20  IN t3.  **.  ** 
10430 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20  which is not at 
10440 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69  all the same thi
10450 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ng..  */.  if( p
10460 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26  SubSrc->nSrc>1 &
10470 26 20 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53  & iFrom>0 && (pS
10480 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a  rc->a[iFrom-1].j
10490 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
104a0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
104b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
104c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
104d0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
104e0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
104f0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
10500 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
10510 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
10520 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
10530 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
10540 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
10550 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
10560 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
10570 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
10580 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
10590 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
105a0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
105b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
105c0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
105d0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
105e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
105f0 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
10600 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
10610 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
10620 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
10630 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
10640 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
10650 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
10660 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
10670 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
10680 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
10690 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
106a0 20 2a 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e   */.  if( iFrom>
106b0 30 20 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46  0 && (pSrc->a[iF
106c0 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  rom-1].jointype 
106d0 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
106e0 20 20 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70        && pSub->p
106f0 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
10700 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
10710 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
10720 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
10730 65 61 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20  eans flattening 
10740 69 73 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72  is permitted for
10750 20 74 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d   the.  ** iFrom-
10760 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  th entry of the 
10770 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
10780 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
10790 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20    */..  /* Move 
107a0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
107b0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
107c0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
107d0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
107e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
107f0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
10800 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
10810 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
10820 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
10830 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
10840 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
10850 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
10860 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
10870 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
10880 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
10890 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
108a0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
108b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
108c0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
108d0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
108e0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
108f0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
10900 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
10910 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
10920 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
10930 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
10940 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
10950 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50  ng in..  */.  iP
10960 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
10970 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20  ->iCursor;.  {. 
10980 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
10990 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
109a0 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
109b0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69   = pSubitem->joi
109c0 6e 74 79 70 65 3b 0a 20 20 20 20 54 61 62 6c 65  ntype;.    Table
109d0 20 2a 70 54 61 62 20 3d 20 70 53 75 62 69 74 65   *pTab = pSubite
109e0 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  m->pTab;..    if
109f0 28 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  ( pTab && pTab->
10a00 69 73 54 72 61 6e 73 69 65 6e 74 20 29 7b 0a 20  isTransient ){. 
10a10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
10a20 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75 62 69  teTable(0, pSubi
10a30 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
10a40 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
10a50 28 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61  (pSubitem->zData
10a60 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
10a70 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
10a80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
10a90 74 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d  teFree(pSubitem-
10aa0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66  >zAlias);.    if
10ab0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
10ac0 20 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d       int extra =
10ad0 20 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20   nSubSrc - 1;.  
10ae0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
10af0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
10b00 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
10b10 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
10b20 64 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20  d(pSrc, 0, 0);. 
10b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
10b40 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20  pSrc = pSrc;.   
10b50 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
10b60 53 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d  Src-1; i-extra>=
10b70 69 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20  iFrom; i--){.   
10b80 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20       pSrc->a[i] 
10b90 3d 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72  = pSrc->a[i-extr
10ba0 61 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a];.      }.    
10bb0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
10bc0 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
10bd0 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
10be0 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
10bf0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
10c00 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
10c10 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
10c20 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
10c30 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
10c40 61 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d  a[iFrom+nSubSrc-
10c50 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f  1].jointype = jo
10c60 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f  intype;.  }..  /
10c70 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73  * Now begin subs
10c80 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72  tituting subquer
10c90 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  y result set exp
10ca0 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20  ressions for .  
10cb0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
10cc0 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
10cd0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
10ce0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d  .  ** .  ** Exam
10cf0 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
10d00 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
10d10 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
10d20 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
10d30 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
10d40 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20  E a>b;.  **   \ 
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10d70 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
10d80 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
10d90 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f   /.  **    \____
10da0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10db0 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
10dc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10dd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
10de0 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  **.  ** We look 
10df0 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
10e00 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
10e10 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
10e20 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
10e30 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
10e40 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
10e50 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
10e60 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
10e70 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f  ute "y+10"..  */
10e80 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
10e90 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  (p->pEList, iPar
10ea0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
10eb0 74 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d  t);.  pList = p-
10ec0 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69  >pEList;.  for(i
10ed0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
10ee0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
10ef0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69  pr *pExpr;.    i
10f00 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
10f10 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
10f20 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
10f30 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
10f40 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  0 ){.      pList
10f50 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
10f60 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
10f70 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
10f80 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
10f90 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  }.  }.  if( isAg
10fa0 67 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  g ){.    substEx
10fb0 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
10fc0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
10fd0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
10fe0 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61  substExpr(p->pHa
10ff0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
11000 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
11010 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  }.  if( pSub->pO
11020 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73  rderBy ){.    as
11030 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
11040 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  y==0 );.    p->p
11050 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
11060 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53  pOrderBy;.    pS
11070 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
11080 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
11090 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
110a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
110b0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
110c0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
110d0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
110e0 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
110f0 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
11100 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
11110 70 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65  pWhere);.  }else
11120 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30  {.    pWhere = 0
11130 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71  ;.  }.  if( subq
11140 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
11150 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76   assert( p->pHav
11160 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ing==0 );.    p-
11170 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57  >pHaving = p->pW
11180 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68  here;.    p->pWh
11190 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
111a0 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70    substExpr(p->p
111b0 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
111c0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
111d0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
111e0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
111f0 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69  p->pHaving, sqli
11200 74 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d  te3ExprDup(pSub-
11210 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20  >pHaving));.    
11220 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
11230 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  pBy==0 );.    p-
11240 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
11250 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
11260 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
11270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62    }else{.    sub
11280 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
11290 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
112a0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d  >pEList);.    p-
112b0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
112c0 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
112d0 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d  re, pWhere);.  }
112e0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74  ..  /* The flatt
112f0 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
11300 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
11310 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
11320 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65  e.  ** outer que
11330 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
11340 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73  .  */.  p->isDis
11350 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
11360 74 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69  tinct || pSub->i
11370 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a  sDistinct;..  /*
11380 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e  .  ** SELECT ...
11390 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
113a0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
113b0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
113c0 45 54 20 79 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  ET y;.  */.  if(
113d0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
113e0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
113f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
11400 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
11410 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  = 0;.  }..  /* F
11420 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
11430 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
11440 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
11450 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
11460 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
11470 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11480 28 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e  (pSub);.  return
11490 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
114a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
114b0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79   */../*.** Analy
114c0 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ze the SELECT st
114d0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69  atement passed i
114e0 6e 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  n as an argument
114f0 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a   to see if it.**
11500 20 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e   is a simple min
11510 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
11520 79 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64  y.  If it is and
11530 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
11540 62 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20  be.** satisfied 
11550 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73  using a single s
11560 65 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  eek to the begin
11570 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61  ning or end of a
11580 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e  n index,.** then
11590 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   generate the co
115a0 64 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  de for this SELE
115b0 43 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e  CT and return 1.
115c0 20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74    If this is not
115d0 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69   a .** simple mi
115e0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
115f0 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ry, then return 
11600 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c  0;.**.** A simpl
11610 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  y min() or max()
11620 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b   query looks lik
11630 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
11640 20 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46   SELECT min(a) F
11650 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20  ROM table;.**   
11660 20 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46   SELECT max(a) F
11670 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a  ROM table;.**.**
11680 20 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68   The query may h
11690 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ave only a singl
116a0 65 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46  e table in its F
116b0 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  ROM argument.  T
116c0 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e  here.** can be n
116d0 6f 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41  o GROUP BY or HA
116e0 56 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c  VING or WHERE cl
116f0 61 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75  auses.  The resu
11700 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62  lt set must.** b
11710 65 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d  e the min() or m
11720 61 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65  ax() of a single
11730 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
11740 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d  able.  The colum
11750 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28  n.** in the min(
11760 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
11770 69 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65  ion must be inde
11780 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  xed..**.** The p
11790 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69  arameters to thi
117a0 73 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68  s routine are th
117b0 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71  e same as for sq
117c0 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a  lite3Select()..*
117d0 2a 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  * See the header
117e0 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
117f0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
11800 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
11810 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
11820 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  nt simpleMinMaxQ
11830 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
11840 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
11850 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50  nt eDest, int iP
11860 61 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45  arm){.  Expr *pE
11870 78 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  xpr;.  int iCol;
11880 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
11890 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
118a0 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62   int base;.  Vdb
118b0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b  e *v;.  int seek
118c0 4f 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a  Op;.  int cont;.
118d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
118e0 73 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73  st, *pList, eLis
118f0 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
11900 4c 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49  List_item eListI
11910 74 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  tem;.  SrcList *
11920 70 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  pSrc;..  /* Chec
11930 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
11940 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
11950 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
11960 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  ) query.  Return
11970 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74  .  ** zero if it
11980 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20   is  not..  */. 
11990 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
119a0 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c   || p->pHaving |
119b0 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  | p->pWhere ) re
119c0 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
119d0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
119e0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
119f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69  return 0;.  pELi
11a00 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
11a10 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
11a20 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
11a30 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c  0;.  pExpr = pEL
11a40 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
11a50 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
11a60 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
11a70 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
11a80 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
11a90 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
11aa0 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  t==0 || pList->n
11ab0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
11ac0 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
11ad0 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
11ae0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
11af0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45  lite3StrNICmp(pE
11b00 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
11b10 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
11b20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69  seekOp = OP_Rewi
11b30 6e 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nd;.  }else if( 
11b40 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
11b50 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
11b60 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
11b70 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61    seekOp = OP_La
11b80 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
11b90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
11ba0 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   pExpr = pList->
11bb0 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
11bc0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
11bd0 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
11be0 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70  0;.  iCol = pExp
11bf0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54  r->iColumn;.  pT
11c00 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
11c10 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  pTab;..  /* If w
11c20 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69  e get to here, i
11c30 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72  t means the quer
11c40 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  y is of the corr
11c50 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43  ect form..  ** C
11c60 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
11c70 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64  e we have an ind
11c80 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78  ex and make pIdx
11c90 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20   point to the.  
11ca0 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69  ** appropriate i
11cb0 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69  ndex.  If the mi
11cc0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20  n() or max() is 
11cd0 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  on an INTEGER PR
11ce0 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63  IMARY.  ** key c
11cf0 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20  olumn, no index 
11d00 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  is necessary so 
11d10 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c  set pIdx to NULL
11d20 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73  .  If no.  ** us
11d30 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f  able index is fo
11d40 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  und, return 0.. 
11d50 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30   */.  if( iCol<0
11d60 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30   ){.    pIdx = 0
11d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43  ;.  }else{.    C
11d80 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
11d90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
11da0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
11db0 29 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  );.    for(pIdx=
11dc0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
11dd0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11de0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
11df0 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
11e00 6d 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn>=1 );.      i
11e10 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
11e20 6e 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49  n[0]==iCol && pI
11e30 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c  dx->keyInfo.aCol
11e40 6c 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72  l[0]==pColl ) br
11e50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
11e60 66 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74  f( pIdx==0 ) ret
11e70 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
11e80 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
11e90 20 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c   types if we wil
11ea0 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63  l be using the c
11eb0 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20  allback.  This. 
11ec0 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70   ** step is skip
11ed0 70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75  ped if the outpu
11ee0 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20  t is going to a 
11ef0 74 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72  table or a memor
11f00 79 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65  y cell..  ** The
11f10 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61   column names ha
11f20 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
11f30 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65  generated in the
11f40 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
11f50 6e 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  n..  */.  v = sq
11f60 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11f70 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
11f80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
11f90 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
11fa0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
11fb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11fc0 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
11fd0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
11fe0 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54  eDest==SRT_TempT
11ff0 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
12000 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12010 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61  OP_OpenTemp, iPa
12020 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
12030 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12040 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
12050 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d  , iParm, 1);.  }
12060 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e  ..  /* Generatin
12070 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64 20 74  g code to find t
12080 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61  he min or the ma
12090 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20 61 6c  x.  Basically al
120a0 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
120b0 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74 68 65  o do is find the
120c0 20 66 69 72 73 74 20 6f 72 20 74 68 65 20 6c 61   first or the la
120d0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
120e0 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20 20 49  chosen index.  I
120f0 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29  f.  ** the min()
12100 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20   or max() is on 
12110 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
12120 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 66 69  ARY KEY, then fi
12130 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  nd the first.  *
12140 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72 79 20  * or last entry 
12150 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
12160 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
12170 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
12180 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  a(pParse, pTab->
12190 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d 20 70  iDb);.  base = p
121a0 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
121b0 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  r;.  computeLimi
121c0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
121d0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 53 72  e, p);.  if( pSr
121e0 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3d  c->a[0].pSelect=
121f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12200 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61  3OpenTableForRea
12210 64 69 6e 67 28 76 2c 20 62 61 73 65 2c 20 70 54  ding(v, base, pT
12220 61 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e 74 20  ab);.  }.  cont 
12230 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12240 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28  eLabel(v);.  if(
12250 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pIdx==0 ){.    
12260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12270 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61 73 65  (v, seekOp, base
12280 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
12290 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67     /* Even thoug
122a0 68 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65  h the cursor use
122b0 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 69 6e  d to open the in
122c0 64 65 78 20 68 65 72 65 20 69 73 20 63 6c 6f 73  dex here is clos
122d0 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73 6f 6f  ed.    ** as soo
122e0 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20 76 61  n as a single va
122f0 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72 65 61  lue has been rea
12300 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c 6f 63  d from it, alloc
12310 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 75 73  ate it.    ** us
12320 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e 54 61  ing (pParse->nTa
12330 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e 74 20  b++) to prevent 
12340 74 68 65 20 63 75 72 73 6f 72 20 69 64 20 66 72  the cursor id fr
12350 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20 2a 2a  om being .    **
12360 20 72 65 75 73 65 64 2e 20 54 68 69 73 20 69 73   reused. This is
12370 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20 73   important for s
12380 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74 68 65  tatements of the
12390 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20 22 49   form .    ** "I
123a0 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c  NSERT INTO x SEL
123b0 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d 20 78  ECT max() FROM x
123c0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  "..    */.    in
123d0 74 20 69 49 64 78 3b 0a 20 20 20 20 69 49 64 78  t iIdx;.    iIdx
123e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
123f0 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
12400 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
12410 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69 44 62  teger, pIdx->iDb
12420 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12430 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
12440 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70  penRead, iIdx, p
12450 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20  Idx->tnum,.     
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
12470 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65 79 49  har*)&pIdx->keyI
12480 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
12490 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b 4f 70  ;.    if( seekOp
124a0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b 0a 20  ==OP_Rewind ){. 
124b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
124c0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
124d0 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
124e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
124f0 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
12500 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  rd, 1, 0);.     
12510 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76   seekOp = OP_Mov
12520 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eGt;.    }.    s
12530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12540 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c  v, seekOp, iIdx,
12550 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12560 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12570 49 64 78 52 65 63 6e 6f 2c 20 69 49 64 78 2c 20  IdxRecno, iIdx, 
12580 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
12590 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
125a0 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a  lose, iIdx, 0);.
125b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
125c0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
125d0 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  e, base, 0);.  }
125e0 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d  .  eList.nExpr =
125f0 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c   1;.  memset(&eL
12600 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  istItem, 0, size
12610 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a  of(eListItem));.
12620 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69    eList.a = &eLi
12630 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e  stItem;.  eList.
12640 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
12650 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  pr;.  selectInne
12660 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
12670 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30   &eList, 0, 0, 0
12680 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
12690 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20  rm, cont, cont, 
126a0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
126b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
126c0 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
126d0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
126e0 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29  _Close, base, 0)
126f0 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b  ;.  .  return 1;
12700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
12710 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
12720 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
12730 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  e in a SELECT st
12740 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
12750 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
12760 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a  f errors seen..*
12770 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  *.** An ORDER BY
12780 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20   or GROUP BY is 
12790 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
127a0 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65  sions.  If any e
127b0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
127c0 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
127d0 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65  ant, then that e
127e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
127f0 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  laced by the.** 
12800 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
12810 74 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c  try in the resul
12820 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
12830 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
12840 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65  rGroupBy(.  Name
12850 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
12860 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
12870 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
12880 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
12890 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
128a0 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
128b0 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
128c0 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
128d0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
128e0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
128f0 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f      /* Either "O
12900 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
12910 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
12920 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
12930 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
12940 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
12950 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
12960 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
12970 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65  ELECT */.  Parse
12980 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
12990 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54  pParse;     /* T
129a0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
129b0 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20   the SELECT */. 
129c0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20   assert( pEList 
129d0 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
129e0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
129f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
12a00 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
12a10 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
12a20 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  ol;.    Expr *pE
12a30 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
12a40 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
12a50 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12a60 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
12a70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
12a80 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
12a90 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
12aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12ab0 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20  prDelete(pE);.  
12ac0 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
12ad0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
12ae0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
12af0 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
12b00 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
12b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12b20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12b30 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
12b40 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d      "%s BY colum
12b50 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
12b60 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
12b70 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
12b80 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
12b90 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f   %d", zType, iCo
12ba0 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
12bb0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12bc0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
12bd0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
12be0 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
12bf0 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
12c00 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
12c10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
12c20 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
12c30 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
12c40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12c50 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12c60 20 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d    "%s BY terms m
12c70 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69  ust not be non-i
12c80 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73  nteger constants
12c90 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  ", zType);.     
12ca0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
12cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12cd0 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20  outine resolves 
12ce0 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69  any names used i
12cf0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
12d00 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c   of the.** suppl
12d10 69 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  ied SELECT state
12d20 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c  ment. If the SEL
12d30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
12d40 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20  ing resolved.** 
12d50 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
12d60 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69   then pOuterNC i
12d70 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12d80 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a  he NameContext .
12d90 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
12da0 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20   SELECT..*/.int 
12db0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
12dc0 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70  olve(.  Parse *p
12dd0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
12de0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
12df0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12e00 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12e10 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
12e20 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
12e30 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
12e40 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
12e50 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e    /* The outer n
12e60 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79  ame context. May
12e70 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a   be NULL. */.){.
12e80 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
12e90 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
12ea0 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20  Result set. */. 
12eb0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12ed0 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65  or-loop variable
12ee0 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c   used in multipl
12ef0 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61  e places */.  Na
12f00 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
12f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
12f20 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a  l name-context *
12f30 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
12f40 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
12f50 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
12f60 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
12f70 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
12f80 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
12f90 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
12fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12fb0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
12fc0 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
12fd0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
12fe0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
12ff0 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
13000 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
13010 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
13020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13030 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
13040 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
13050 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
13060 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
13070 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
13080 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
13090 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
130a0 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
130b0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
130c0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
130d0 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
130e0 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
130f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13100 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
13110 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
13120 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
13130 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
13140 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
13150 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
13160 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
13170 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
13180 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
13190 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
131a0 2f 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  /.  sNC.pParse =
131b0 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 68   pParse;.  sNC.h
131c0 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43  asAgg = 0;.  sNC
131d0 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 4e 43  .nErr = 0;.  sNC
131e0 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 73 4e 43  .nRef = 0;.  sNC
131f0 2e 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20 73  .pEList = 0;.  s
13200 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
13210 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
13220 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  = 0;.  sNC.pNext
13230 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
13240 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
13250 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69  mes(&sNC, p->pLi
13260 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  mit) ||.      sq
13270 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
13280 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
13290 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72  Offset) ){.    r
132a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
132b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OR;.  }..  /* Se
132c0 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e  t up the local n
132d0 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70  ame-context to p
132e0 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c  ass to ExprResol
132f0 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a  veNames() to.  *
13300 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * resolve the ex
13310 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20  pression-list.. 
13320 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41   */.  sNC.allowA
13330 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53  gg = 1;.  sNC.pS
13340 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  rcList = p->pSrc
13350 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20  ;.  sNC.pNext = 
13360 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20  pOuterNC;..  /* 
13370 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 6e 44 65 70  NameContext.nDep
13380 74 68 20 73 74 6f 72 65 73 20 74 68 65 20 64 65  th stores the de
13390 70 74 68 20 6f 66 20 72 65 63 75 72 73 69 6f 6e  pth of recursion
133a0 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
133b0 20 46 6f 72 0a 20 20 2a 2a 20 61 6e 20 6f 75 74   For.  ** an out
133c0 65 72 20 71 75 65 72 79 20 28 65 2e 67 2e 20 53  er query (e.g. S
133d0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
133e0 69 74 65 5f 6d 61 73 74 65 72 29 20 74 68 69 73  ite_master) this
133f0 20 69 73 20 31 2e 20 46 6f 72 0a 20 20 2a 2a 20   is 1. For.  ** 
13400 61 20 73 75 62 71 75 65 72 79 20 69 74 20 69 73  a subquery it is
13410 20 32 2e 20 46 6f 72 20 61 20 73 75 62 71 75 65   2. For a subque
13420 72 79 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  ry of a subquery
13430 2c 20 33 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20  , 3. And so on. 
13440 0a 20 20 2a 2a 20 50 61 72 73 65 2e 6e 4d 61 78  .  ** Parse.nMax
13450 44 65 70 74 68 20 69 73 20 74 68 65 20 6d 61 78  Depth is the max
13460 69 6d 75 6d 20 64 65 70 74 68 20 66 6f 72 20 61  imum depth for a
13470 6e 79 20 73 75 62 71 75 65 72 79 20 72 65 73 6f  ny subquery reso
13480 6c 76 65 64 20 73 6f 0a 20 20 2a 2a 20 66 61 72  lved so.  ** far
13490 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
134a0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
134b0 6e 75 6d 62 65 72 20 6f 66 20 61 67 67 72 65 67  number of aggreg
134c0 61 74 65 20 63 6f 6e 74 65 78 74 73 0a 20 20 2a  ate contexts.  *
134d0 2a 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75  * required at ru
134e0 6e 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 73 4e  ntime..  */.  sN
134f0 43 2e 6e 44 65 70 74 68 20 3d 20 28 70 4f 75 74  C.nDepth = (pOut
13500 65 72 4e 43 3f 70 4f 75 74 65 72 4e 43 2d 3e 6e  erNC?pOuterNC->n
13510 44 65 70 74 68 2b 31 3a 31 29 3b 0a 20 20 69 66  Depth+1:1);.  if
13520 28 20 73 4e 43 2e 6e 44 65 70 74 68 3e 70 50 61  ( sNC.nDepth>pPa
13530 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 20 29  rse->nMaxDepth )
13540 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  {.    pParse->nM
13550 61 78 44 65 70 74 68 20 3d 20 73 4e 43 2e 6e 44  axDepth = sNC.nD
13560 65 70 74 68 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  epth;.  }..  /* 
13570 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
13580 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13590 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
135a0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
135b0 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e  !pEList ) return
135c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
135d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
135e0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
135f0 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
13600 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
13610 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
13620 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
13630 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b  mes(&sNC, pX) ){
13640 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
13650 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
13660 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
13670 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72  here are no aggr
13680 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
13690 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
136a0 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  t, and no GROUP 
136b0 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  BY .  ** express
136c0 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ion, do not allo
136d0 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20  w aggregates in 
136e0 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
136f0 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
13700 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  */.  assert( !p-
13710 3e 69 73 41 67 67 20 29 3b 0a 20 20 69 66 28 20  >isAgg );.  if( 
13720 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 73  p->pGroupBy || s
13730 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  NC.hasAgg ){.   
13740 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20   p->isAgg = 1;. 
13750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e   }else{.    sNC.
13760 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20  allowAgg = 0;.  
13770 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56  }..  /* If a HAV
13780 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72  ING clause is pr
13790 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72  esent, then ther
137a0 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55  e must be a GROU
137b0 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  P BY clause..  *
137c0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  /.  if( p->pHavi
137d0 6e 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70  ng && !p->pGroup
137e0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
137f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13800 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
13810 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
13820 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
13830 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13840 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
13850 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
13860 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
13870 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
13880 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
13890 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
138a0 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
138b0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
138c0 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
138d0 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
138e0 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
138f0 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
13900 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
13910 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
13920 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
13930 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
13940 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
13950 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
13960 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
13970 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
13980 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
13990 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
139a0 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
139b0 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
139c0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
139d0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
139e0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
139f0 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
13a00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13a10 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
13a20 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
13a30 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
13a40 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
13a50 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  NC, p->pOrderBy,
13a60 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20   "ORDER") ||.   
13a70 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
13a80 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e  roupBy(&sNC, p->
13a90 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50  pGroupBy, "GROUP
13aa0 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ").  ){.    retu
13ab0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13ac0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
13ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13ae0 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
13af0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13b00 73 74 72 75 63 74 20 69 73 20 75 73 65 64 20 62  struct is used b
13b10 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
13b20 29 0a 2a 2a 20 74 6f 20 73 61 76 65 20 61 67 67  ).** to save agg
13b30 72 65 67 61 74 65 20 72 65 6c 61 74 65 64 20 69  regate related i
13b40 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
13b50 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
13b60 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
13b70 20 6f 66 20 65 61 63 68 20 63 61 6c 6c 20 61 6e   of each call an
13b80 64 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 20  d to restore it 
13b90 61 74 20 74 68 65 20 65 6e 64 2e 20 53 65 65 0a  at the end. See.
13ba0 2a 2a 20 73 61 76 65 41 67 67 72 65 67 61 74 65  ** saveAggregate
13bb0 49 6e 66 6f 28 29 20 61 6e 64 20 72 65 73 74 6f  Info() and resto
13bc0 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  reAggregateInfo(
13bd0 29 2e 0a 2a 2f 20 0a 73 74 72 75 63 74 20 41 67  )..*/ .struct Ag
13be0 67 72 65 67 61 74 65 49 6e 66 6f 20 7b 0a 20 20  gregateInfo {.  
13bf0 69 6e 74 20 6e 41 67 67 3b 0a 20 20 41 67 67 45  int nAgg;.  AggE
13c00 78 70 72 20 2a 61 41 67 67 3b 0a 7d 3b 0a 74 79  xpr *aAgg;.};.ty
13c10 70 65 64 65 66 20 73 74 72 75 63 74 20 41 67 67  pedef struct Agg
13c20 72 65 67 61 74 65 49 6e 66 6f 20 41 67 67 72 65  regateInfo Aggre
13c30 67 61 74 65 49 6e 66 6f 3b 0a 0a 2f 2a 20 0a 2a  gateInfo;../* .*
13c40 2a 20 43 6f 70 79 20 61 67 67 72 65 67 61 74 65  * Copy aggregate
13c50 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61   related informa
13c60 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61  tion from the Pa
13c70 72 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  rse structure.**
13c80 20 69 6e 74 6f 20 74 68 65 20 41 67 67 72 65 67   into the Aggreg
13c90 61 74 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ateInfo structur
13ca0 65 2e 20 5a 65 72 6f 20 74 68 65 20 61 67 67 72  e. Zero the aggr
13cb0 65 67 61 74 65 20 72 65 6c 61 74 65 64 0a 2a 2a  egate related.**
13cc0 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 50   values in the P
13cd0 61 72 73 65 20 73 74 72 75 63 74 2e 0a 2a 2f 0a  arse struct..*/.
13ce0 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 76 65  static void save
13cf0 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 50 61  AggregateInfo(Pa
13d00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
13d10 72 65 67 61 74 65 49 6e 66 6f 20 2a 70 49 6e 66  regateInfo *pInf
13d20 6f 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 61 41 67  o){.  pInfo->aAg
13d30 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
13d40 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 20  ;.  pInfo->nAgg 
13d50 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 0a  = pParse->nAgg;.
13d60 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
13d70 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41   0;.  pParse->nA
13d80 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
13d90 20 43 6f 70 79 20 61 67 67 72 65 67 61 74 65 20   Copy aggregate 
13da0 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74  related informat
13db0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41 67 67  ion from the Agg
13dc0 72 65 67 61 74 65 49 6e 66 6f 20 73 74 72 75 63  regateInfo struc
13dd0 74 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74  t.** back into t
13de0 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
13df0 72 65 2e 20 54 68 65 20 61 67 67 72 65 67 61 74  re. The aggregat
13e00 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d  e related inform
13e10 61 74 69 6f 6e 0a 2a 2a 20 63 75 72 72 65 6e 74  ation.** current
13e20 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
13e30 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
13e40 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   is deleted..*/.
13e50 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 74  static void rest
13e60 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  oreAggregateInfo
13e70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13e80 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20 2a 70  AggregateInfo *p
13e90 49 6e 66 6f 29 7b 0a 20 20 73 71 6c 69 74 65 46  Info){.  sqliteF
13ea0 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67  ree(pParse->aAgg
13eb0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67  );.  pParse->aAg
13ec0 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 41 67 67 3b  g = pInfo->aAgg;
13ed0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  .  pParse->nAgg 
13ee0 3d 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 3b 0a 7d  = pInfo->nAgg;.}
13ef0 0a 20 20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .  ./*.** Genera
13f00 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
13f10 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
13f20 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
13f30 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
13f40 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
13f50 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
13f60 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
13f70 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
13f80 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
13f90 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
13fa0 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
13fb0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
13fc0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
13ff0 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
14000 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
14010 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
14020 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
14030 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
14040 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
14050 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
14060 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
14070 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
14080 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
14090 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
140a0 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20  s keys of table 
140b0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
140c0 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
140d0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
140e0 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
140f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
14100 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
14110 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d  _Except      Rem
14120 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  ove results from
14130 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14140 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  able iParm..**.*
14150 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
14160 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
14170 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
14180 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
14190 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f  ** The table abo
141a0 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65  ve is incomplete
141b0 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44  .  Additional eD
141c0 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62  ist value have b
141d0 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65  e added.** since
141e0 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61   this comment wa
141f0 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20  s written.  See 
14200 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  the selectInnerL
14210 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  oop() function f
14220 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65  or.** a complete
14230 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
14240 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
14250 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
14260 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
14270 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
14280 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
14290 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
142a0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
142b0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
142c0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
142d0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
142e0 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
142f0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
14300 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14310 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
14320 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
14330 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
14340 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
14350 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
14360 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
14370 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
14380 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
14390 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
143a0 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
143b0 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
143c0 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
143d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
143e0 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
143f0 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
14400 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
14410 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
14420 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
14430 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
14440 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
14450 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
14460 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
14470 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
14480 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
14490 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
144a0 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
144b0 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
144c0 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
144d0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
144e0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
144f0 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
14500 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
14510 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
14520 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
14530 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
14540 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
14550 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
14560 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
14590 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
145a0 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
145f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14600 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
14610 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
14620 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
14630 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14640 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
14650 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
14660 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
14670 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
14680 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
14690 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
146a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
146b0 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
146c0 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
146d0 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
146e0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
146f0 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
14700 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
14710 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
14720 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14730 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
14740 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
14750 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
14760 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
14770 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
14780 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
14790 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
147a0 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
147b0 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
147c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
147d0 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
147e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
147f0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
14800 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
14810 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14820 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
14830 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
14840 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20  coded. */.  int 
14850 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
14860 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
14870 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
14880 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
14890 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
148a0 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75  /* A parameter u
148b0 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74  sed by the eDest
148c0 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
148d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
148e0 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  arent,       /* 
148f0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66  Another SELECT f
14900 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
14910 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a   a sub-query */.
14920 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c    int parentTab,
14930 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14940 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53  x in pParent->pS
14950 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79  rc of this query
14960 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65   */.  int *pPare
14970 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20  ntAgg,       /* 
14980 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
14990 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
149a0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  unctions */.  ch
149b0 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
149c0 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
149d0 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
149e0 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
149f0 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ng */.){.  int i
14a00 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
14a10 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76  WInfo;.  Vdbe *v
14a20 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  ;.  int isAgg;  
14a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14a40 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
14a50 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
14a60 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
14a70 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
14a80 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
14a90 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
14aa0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
14ab0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
14ac0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
14ad0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
14ae0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
14af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
14b00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
14b10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
14b20 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
14b30 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
14b40 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
14b50 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
14b60 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
14b70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
14b80 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
14b90 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
14ba0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
14bb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
14bc0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
14bd0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
14be0 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
14bf0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14c00 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
14c10 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
14c20 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
14c30 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
14c40 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
14c50 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
14c60 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
14c70 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
14c80 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
14c90 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
14ca0 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 72 65 67  tion */.  Aggreg
14cb0 61 74 65 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  ateInfo sAggInfo
14cc0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
14cd0 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c  _malloc_failed |
14ce0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
14cf0 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  | p==0 ) return 
14d00 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
14d10 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14d20 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
14d30 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
14d40 72 6e 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53  rn 1;..#ifndef S
14d50 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
14d60 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
14d70 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
14d80 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
14d90 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
14da0 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
14db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14dc0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
14dd0 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
14de0 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
14df0 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a  t, iParm, aff);.
14e00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 61    }.#endif..  sa
14e10 76 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  veAggregateInfo(
14e20 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
14e30 6f 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  o);.  pOrderBy =
14e40 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
14e50 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
14e60 6e 69 6f 6e 20 7c 7c 20 65 44 65 73 74 3d 3d 53  nion || eDest==S
14e70 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 65 44 65  RT_Except || eDe
14e80 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
14e90 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
14ea0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  By = 0;.  }.  if
14eb0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
14ec0 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
14ed0 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , 0) ){.    goto
14ee0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
14ef0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
14f00 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
14f10 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
14f20 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
14f30 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
14f40 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
14f50 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
14f60 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
14f70 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
14f80 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
14f90 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
14fa0 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20  Having;.  isAgg 
14fb0 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73  = p->isAgg;.  is
14fc0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
14fd0 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69  Distinct;.  pELi
14fe0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
14ff0 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
15000 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
15010 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
15020 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
15030 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
15040 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
15050 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
15060 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
15070 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
15080 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
15090 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
150a0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
150b0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
150c0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
150d0 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
150e0 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
150f0 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
15100 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
15110 2f 0a 20 20 61 73 73 65 72 74 28 20 65 44 65 73  /.  assert( eDes
15120 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t!=SRT_Exists ||
15130 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
15140 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1 );.#ifndef SQL
15150 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
15160 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  Y.  if( (eDest==
15170 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
15180 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
15190 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
151a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
151b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
151c0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
151d0 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
151e0 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
151f0 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
15200 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
15210 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
15220 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
15230 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
15240 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
15250 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
15260 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ns..  */.  switc
15270 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
15280 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a  case SRT_Union:.
15290 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
152a0 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ept:.    case SR
152b0 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20  T_Discard:.     
152c0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
152d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
152e0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62  default:.      b
152f0 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
15300 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
15310 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
15320 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15330 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15340 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
15350 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64  ct_end;..  /* Id
15360 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
15370 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
15380 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  e using them in 
15390 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
153a0 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
153b0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
153c0 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
153d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74   some other dest
153e0 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ination..  */.  
153f0 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
15400 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
15410 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
15420 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
15430 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
15440 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
15450 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
15460 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
15470 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
15480 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
15490 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
154a0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
154b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
154c0 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
154d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
154e0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
154f0 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
15500 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
15510 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65   int needRestore
15520 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69 66  Context;..    if
15530 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
15540 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  .pSelect==0 ) co
15550 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15560 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
15570 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
15580 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
15590 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
155a0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
155b0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
155c0 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73 74  ntext = pTabList
155d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
155e0 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43      needRestoreC
155f0 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20  ontext = 1;.    
15600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65  }else{.      nee
15610 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
15620 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
15630 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15640 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
15650 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54  [i].pSelect, SRT
15660 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20  _TempTable, .   
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
15680 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
15690 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41  rsor, p, i, &isA
156a0 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gg, 0);.    if( 
156b0 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
156c0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
156d0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
156e0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
156f0 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
15700 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
15710 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
15720 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
15730 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55  if( eDest!=SRT_U
15740 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53  nion && eDest!=S
15750 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44 65  RT_Except && eDe
15760 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st!=SRT_Discard 
15770 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
15780 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
15790 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
157a0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
157b0 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
157c0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
157d0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
157e0 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
157f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
15800 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
15810 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
15820 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
15830 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
15840 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
15850 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
15860 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
15870 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
15880 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
15890 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
158a0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
158b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
158c0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
158d0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
158e0 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
158f0 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
15900 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
15910 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
15920 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
15930 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
15940 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
15950 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15960 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
15970 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
15980 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
15990 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
159a0 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
159b0 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
159c0 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
159d0 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
159e0 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
159f0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
15a00 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
15a10 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
15a20 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
15a30 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
15a40 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
15a50 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
15a60 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
15a70 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
15a80 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
15a90 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
15aa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15ab0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
15ac0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15ad0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a  pOrderBy->a[i].z
15ae0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
15af0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
15b00 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20  Expr->pColl = . 
15b10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
15b20 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
15b30 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
15b40 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31  ->a[i].zName, -1
15b50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15b60 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
15b70 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
15b80 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15b90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15ba0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
15bb0 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
15bc0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
15bd0 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
15be0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
15bf0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
15c00 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
15c10 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
15c20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
15c30 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
15c40 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15c50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15c60 4f 70 65 6e 54 65 6d 70 2c 20 69 50 61 72 6d 2c  OpenTemp, iParm,
15c70 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
15c80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15c90 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69  SetNumColumns, i
15ca0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
15cb0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
15cc0 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69 73 20 6f  Do an analysis o
15cd0 66 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  f aggregate expr
15ce0 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
15cf0 69 66 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  if( isAgg || pGr
15d00 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 4e 61 6d  oupBy ){.    Nam
15d10 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
15d20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
15d30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
15d40 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
15d50 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
15d60 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
15d70 4c 69 73 74 3b 0a 0a 20 20 20 20 61 73 73 65 72  List;..    asser
15d80 74 28 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3d  t( pParse->nAgg=
15d90 3d 30 20 29 3b 0a 20 20 20 20 69 73 41 67 67 20  =0 );.    isAgg 
15da0 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 1;.    for(i=0
15db0 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
15dc0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
15dd0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
15de0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
15df0 26 73 4e 43 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  &sNC, pEList->a[
15e00 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
15e10 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
15e20 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
15e30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 47 72 6f    }.    if( pGro
15e40 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  upBy ){.      fo
15e50 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42  r(i=0; i<pGroupB
15e60 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
15e70 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
15e80 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
15e90 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
15ea0 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45  GroupBy->a[i].pE
15eb0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
15ec0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
15ed0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
15ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15ef0 66 28 20 70 48 61 76 69 6e 67 20 26 26 20 73 71  f( pHaving && sq
15f00 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
15f10 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
15f20 20 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20   pHaving) ){.   
15f30 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
15f40 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  nd;.    }.    if
15f50 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
15f60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15f70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
15f80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
15f90 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
15fa0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
15fb0 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  sNC, pOrderBy->a
15fc0 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
15fd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
15fe0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
15ff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16000 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74  .  }..  /* Reset
16010 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 0a   the aggregator.
16020 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 41 67 67    */.  if( isAgg
16030 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
16040 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16050 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 52 65 73  dOp(v, OP_AggRes
16060 65 74 2c 20 28 70 47 72 6f 75 70 42 79 3f 30 3a  et, (pGroupBy?0:
16070 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  1), pParse->nAgg
16080 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
16090 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
160a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  i++){.      Func
160b0 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20 20 20 20  Def *pFunc;.    
160c0 20 20 69 66 28 20 28 70 46 75 6e 63 20 3d 20 70    if( (pFunc = p
160d0 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
160e0 46 75 6e 63 29 21 3d 30 20 26 26 20 70 46 75 6e  Func)!=0 && pFun
160f0 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  c->xFinalize!=0 
16100 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16110 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16120 41 67 67 49 6e 69 74 2c 20 30 2c 20 69 2c 20 28  AggInit, 0, i, (
16130 63 68 61 72 2a 29 70 46 75 6e 63 2c 20 50 33 5f  char*)pFunc, P3_
16140 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
16150 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
16160 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
16170 20 20 69 6e 74 20 73 7a 20 3d 20 73 69 7a 65 6f    int sz = sizeo
16180 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 70 47 72  f(KeyInfo) + pGr
16190 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2a 73 69 7a  oupBy->nExpr*siz
161a0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20  eof(CollSeq*);. 
161b0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
161c0 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29  ey = (KeyInfo *)
161d0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 7a 29  sqliteMalloc(sz)
161e0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
161f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 67  Key ){.        g
16200 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
16210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4b        }.      pK
16220 65 79 2d 3e 65 6e 63 20 3d 20 70 50 61 72 73 65  ey->enc = pParse
16230 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  ->db->enc;.     
16240 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20   pKey->nField = 
16250 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
16260 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16270 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
16280 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
16290 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pKey->aColl[i] 
162a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
162b0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 47 72  lSeq(pParse, pGr
162c0 6f 75 70 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  oupBy->a[i].pExp
162d0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
162e0 21 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  !pKey->aColl[i] 
162f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  ){.          pKe
16300 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  y->aColl[i] = pP
16310 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
16320 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oll;.        }. 
16330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16340 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
16350 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20  (v, addr, (char 
16360 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e  *)pKey, P3_KEYIN
16370 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
16380 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
16390 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
163a0 72 79 20 63 65 6c 6c 20 74 6f 20 4e 55 4c 4c 20  ry cell to NULL 
163b0 66 6f 72 20 53 52 54 5f 4d 65 6d 20 6f 72 20 30  for SRT_Mem or 0
163c0 20 66 6f 72 20 53 52 54 5f 45 78 69 73 74 73 0a   for SRT_Exists.
163d0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
163e0 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
163f0 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st==SRT_Exists )
16400 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16410 65 41 64 64 4f 70 28 76 2c 20 65 44 65 73 74 3d  eAddOp(v, eDest=
16420 3d 53 52 54 5f 4d 65 6d 20 3f 20 4f 50 5f 53 74  =SRT_Mem ? OP_St
16430 72 69 6e 67 38 20 3a 20 4f 50 5f 49 6e 74 65 67  ring8 : OP_Integ
16440 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  er, 0, 0);.    s
16450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
16460 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
16470 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a  iParm, 1);.  }..
16480 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70    /* Open a temp
16490 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 75  orary table to u
164a0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
164b0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
164c0 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
164d0 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
164e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
164f0 0a 20 20 20 20 6f 70 65 6e 54 65 6d 70 49 6e 64  .    openTempInd
16500 65 78 28 70 50 61 72 73 65 2c 20 70 2c 20 64 69  ex(pParse, p, di
16510 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 7d 65  stinct, 0);.  }e
16520 6c 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  lse{.    distinc
16530 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  t = -1;.  }..  /
16540 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
16550 62 61 73 65 20 73 63 61 6e 0a 20 20 2a 2f 0a 20  base scan.  */. 
16560 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
16570 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
16580 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
16590 68 65 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20  here,.          
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 20 70 47 72 6f 75 70 42 79 20 3f 20 30 20     pGroupBy ? 0 
165c0 3a 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  : &pOrderBy);.  
165d0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
165e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
165f0 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  ..  /* Use the s
16600 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
16610 6f 70 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  op if we are not
16620 20 64 65 61 6c 69 6e 67 20 77 69 74 68 0a 20 20   dealing with.  
16630 2a 2a 20 61 67 67 72 65 67 61 74 65 73 0a 20 20  ** aggregates.  
16640 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  */.  if( !isAgg 
16650 29 7b 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63  ){.    if( selec
16660 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
16670 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
16680 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69   0, pOrderBy, di
16690 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20  stinct, eDest,. 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 69 50 61 72 6d 2c 20 70 57 49 6e 66 6f     iParm, pWInfo
166c0 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
166d0 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 61 66 66  nfo->iBreak, aff
166e0 29 20 29 7b 0a 20 20 20 20 20 20 20 67 6f 74 6f  ) ){.       goto
166f0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
16700 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
16710 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
16720 69 74 68 20 61 67 67 72 65 67 61 74 65 73 2c 20  ith aggregates, 
16730 74 68 65 6e 20 64 6f 20 74 68 65 20 73 70 65 63  then do the spec
16740 69 61 6c 20 61 67 67 72 65 67 61 74 65 0a 20 20  ial aggregate.  
16750 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  ** processing.  
16760 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
16770 20 20 41 67 67 45 78 70 72 20 2a 70 41 67 67 3b    AggExpr *pAgg;
16780 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31 20 3d 20  .    int lbl1 = 
16790 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 66  0;.    pParse->f
167a0 69 6c 6c 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  illAgg = 1;.    
167b0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
167c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
167d0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
167e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
167f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
16800 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
16810 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
16820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
16830 4e 6f 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  No affinity stri
16840 6e 67 20 69 73 20 61 74 74 61 63 68 65 64 20 74  ng is attached t
16850 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
16860 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20  OP_MakeRecord . 
16870 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
16880 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
16890 6f 20 64 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f  o do any coercio
168a0 6e 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20  n of datatypes. 
168b0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
168c0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
168d0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 47 72 6f  MakeRecord, pGro
168e0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b  upBy->nExpr, 0);
168f0 0a 20 20 20 20 20 20 6c 62 6c 31 20 3d 20 73 71  .      lbl1 = sq
16900 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
16910 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
16920 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16930 20 4f 50 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c   OP_AggFocus, 0,
16940 20 6c 62 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20   lbl1);.    }.  
16950 20 20 66 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d    for(i=0, pAgg=
16960 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c  pParse->aAgg; i<
16970 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
16980 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20  +, pAgg++){.    
16990 20 20 69 66 28 20 70 41 67 67 2d 3e 69 73 41 67    if( pAgg->isAg
169a0 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
169b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
169c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 41 67 67  ode(pParse, pAgg
169d0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
169e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
169f0 28 76 2c 20 4f 50 5f 41 67 67 53 65 74 2c 20 30  (v, OP_AggSet, 0
16a00 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , i);.    }.    
16a10 70 50 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20  pParse->fillAgg 
16a20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 62 6c  = 0;.    if( lbl
16a30 31 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  1<0 ){.      sql
16a40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16a50 61 62 65 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20  abel(v, lbl1);. 
16a60 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
16a70 2c 20 70 41 67 67 3d 70 50 61 72 73 65 2d 3e 61  , pAgg=pParse->a
16a80 41 67 67 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  Agg; i<pParse->n
16a90 41 67 67 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b  Agg; i++, pAgg++
16aa0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16ab0 45 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  E;.      int nEx
16ac0 70 72 3b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  pr;.      FuncDe
16ad0 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20 69  f *pDef;.      i
16ae0 66 28 20 21 70 41 67 67 2d 3e 69 73 41 67 67 20  f( !pAgg->isAgg 
16af0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16b00 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
16b10 70 46 75 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20  pFunc!=0 );.    
16b20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e    assert( pAgg->
16b30 70 46 75 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20  pFunc->xStep!=0 
16b40 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
16b50 70 41 67 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pAgg->pFunc;.   
16b60 20 20 20 70 45 20 3d 20 70 41 67 67 2d 3e 70 45     pE = pAgg->pE
16b70 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
16b80 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20  t( pE!=0 );.    
16b90 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
16ba0 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
16bb0 4e 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  N );.      nExpr
16bc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16bd0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
16be0 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20  e, pE->pList);. 
16bf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16c00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
16c10 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  ger, i, 0);.    
16c20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
16c30 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
16c40 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
16c50 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
16c60 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
16c70 72 28 6a 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26  r(j=0; !pColl &&
16c80 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a   j<nExpr; j++){.
16c90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
16ca0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
16cb0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 2d  lSeq(pParse, pE-
16cc0 3e 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  >pList->a[j].pEx
16cd0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
16ce0 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
16cf0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72  l ) pColl = pPar
16d00 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
16d10 6c 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  l;.        sqlit
16d20 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
16d30 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
16d40 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
16d50 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
16d60 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16d70 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
16d80 67 46 75 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c  gFunc, 0, nExpr,
16d90 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
16da0 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 7d  _POINTER);.    }
16db0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  .  }..  /* End t
16dc0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
16dd0 20 6c 6f 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71   loop..  */.  sq
16de0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
16df0 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Info);..  /* If 
16e00 77 65 20 61 72 65 20 70 72 6f 63 65 73 73 69 6e  we are processin
16e10 67 20 61 67 67 72 65 67 61 74 65 73 2c 20 77 65  g aggregates, we
16e20 20 6e 65 65 64 20 74 6f 20 73 65 74 20 75 70 20   need to set up 
16e30 61 20 73 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20  a second loop.  
16e40 2a 2a 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  ** over all of t
16e50 68 65 20 61 67 67 72 65 67 61 74 65 20 76 61 6c  he aggregate val
16e60 75 65 73 20 61 6e 64 20 70 72 6f 63 65 73 73 20  ues and process 
16e70 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  them..  */.  if(
16e80 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 69 6e   isAgg ){.    in
16e90 74 20 65 6e 64 61 67 67 20 3d 20 73 71 6c 69 74  t endagg = sqlit
16ea0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16eb0 76 29 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  v);.    int star
16ec0 74 61 67 67 3b 0a 20 20 20 20 73 74 61 72 74 61  tagg;.    starta
16ed0 67 67 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  gg = sqlite3Vdbe
16ee0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e  AddOp(v, OP_AggN
16ef0 65 78 74 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b  ext, 0, endagg);
16f00 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
16f10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16f20 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
16f30 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 73 74  rse, pHaving, st
16f40 61 72 74 61 67 67 2c 20 31 29 3b 0a 20 20 20 20  artagg, 1);.    
16f50 7d 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74  }.    if( select
16f60 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
16f70 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20  , p, pEList, 0, 
16f80 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 64 69 73  0, pOrderBy, dis
16f90 74 69 6e 63 74 2c 20 65 44 65 73 74 2c 0a 20 20  tinct, eDest,.  
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fb0 20 20 69 50 61 72 6d 2c 20 73 74 61 72 74 61 67    iParm, startag
16fc0 67 2c 20 65 6e 64 61 67 67 2c 20 61 66 66 29 20  g, endagg, aff) 
16fd0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
16fe0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
16ff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17000 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
17010 20 30 2c 20 73 74 61 72 74 61 67 67 29 3b 0a 20   0, startagg);. 
17020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17030 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
17040 64 61 67 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dagg);.    sqlit
17050 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
17060 50 5f 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  P_Noop, 0, 0);. 
17070 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
17080 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
17090 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
170a0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
170b0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
170c0 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
170d0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
170e0 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
170f0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
17100 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
17110 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
17120 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
17130 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
17140 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
17150 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17160 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  RY.  /* If this 
17170 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
17180 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
17190 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
171a0 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
171b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
171c0 20 53 6f 20 64 65 6c 65 74 65 20 74 68 65 20 73   So delete the s
171d0 75 62 71 75 65 72 79 20 73 74 72 75 63 74 75 72  ubquery structur
171e0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  e from the paren
171f0 74 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e  t.  ** to preven
17200 74 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  t this subquery 
17210 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c 75  from being evalu
17220 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20 74  ated again and t
17230 6f 20 66 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a  o force the.  **
17240 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   the use of the 
17250 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
17260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
17270 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
17280 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63  t( pParent->pSrc
17290 2d 3e 6e 53 72 63 3e 70 61 72 65 6e 74 54 61 62  ->nSrc>parentTab
172a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
172b0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61  pParent->pSrc->a
172c0 5b 70 61 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c  [parentTab].pSel
172d0 65 63 74 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71  ect==p );.    sq
172e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
172f0 65 28 70 29 3b 0a 20 20 20 20 70 50 61 72 65 6e  e(p);.    pParen
17300 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
17310 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20  tTab].pSelect = 
17320 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  0;.  }.#endif.. 
17330 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77   /* The SELECT w
17340 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
17350 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65  coded.   Set the
17360 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
17370 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  0.  ** to indica
17380 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20  te no errors..  
17390 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20  */.  rc = 0;..  
173a0 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
173b0 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
173c0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
173d0 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
173e0 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
173f0 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
17400 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
17410 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 73 74  lect_end:.  rest
17420 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  oreAggregateInfo
17430 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
17440 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fo);.  return rc
17450 3b 0a 7d 0a                                      ;.}.