/ Hex Artifact Content
Login

Artifact f8a9993bcd953eb325c8c3f32985cc52b2947354:


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 35 35  select.c,v 1.255
0200: 20 32 30 30 35 2f 30 38 2f 32 38 20 30 31 3a 33   2005/08/28 01:3
0210: 34 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a 2a  4:22 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 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0ab0: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0ac0: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0ad0: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0ae0: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0af0: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0b00: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0b10: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0b20: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0b30: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0b40: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0b50: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0b60: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0b70: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0b80: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0b90: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0ba0: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0bb0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0bc0: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0bd0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0be0: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b    };.  int i, j;
0bf0: 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41  .  apAll[0] = pA
0c00: 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70  ;.  apAll[1] = p
0c10: 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20  B;.  apAll[2] = 
0c20: 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  pC;.  for(i=0; i
0c30: 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20  <3 && apAll[i]; 
0c40: 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70  i++){.    p = ap
0c50: 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  All[i];.    for(
0c60: 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f 66 28 6b 65  j=0; j<sizeof(ke
0c70: 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b  ywords)/sizeof(k
0c80: 65 79 77 6f 72 64 73 5b 30 5d 29 3b 20 6a 2b 2b  eywords[0]); j++
0c90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
0ca0: 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 6e  n==keywords[j].n
0cb0: 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20 20  Char .          
0cc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
0cd0: 6d 70 28 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  mp(p->z, keyword
0ce0: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
0cf0: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
0d00: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
0d10: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
0d20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
0d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0d40: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
0d50: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
0d60: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
0d70: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
0d80: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
0d90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0da0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
0db0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
0dc0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
0dd0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
0de0: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
0df0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
0e00: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
0e10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31 20  onst char *zSp1 
0e20: 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73 74  = " ";.    const
0e30: 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22 20   char *zSp2 = " 
0e40: 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d 30  ";.    if( pB==0
0e50: 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20   ){ zSp1++; }.  
0e60: 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a    if( pC==0 ){ z
0e70: 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  Sp2++; }.    sql
0e80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
0e90: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
0ea0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
0eb0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
0ec0: 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20 70   "%T%s%T%s%T", p
0ed0: 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53 70  A, zSp1, pB, zSp
0ee0: 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e  2, pC);.    join
0ef0: 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b  type = JT_INNER;
0f00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69  .  }else if( joi
0f10: 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54  ntype & JT_RIGHT
0f20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
0f30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0f40: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
0f50: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
0f60: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
0f70: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
0f80: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
0f90: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
0fa0: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
0fb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0fc0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
0fd0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
0fe0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
0ff0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1000: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1010: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1020: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1030: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1040: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1050: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1060: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1070: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1080: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1090: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
10a0: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
10b0: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
10c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
10d0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  1;.}../*.** Set 
10e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74  the value of a t
10f0: 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27  oken to a '\000'
1100: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
1110: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
1120: 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65  id setToken(Toke
1130: 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  n *p, const char
1140: 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 7a   *z){.  p->z = z
1150: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65  ;.  p->n = strle
1160: 6e 28 7a 29 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d  n(z);.  p->dyn =
1170: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
1180: 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ate an expressio
1190: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64  n node for an id
11a0: 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74 68  entifier with th
11b0: 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a  e name of zName.
11c0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
11d0: 63 72 65 61 74 65 49 64 45 78 70 72 28 63 6f 6e  createIdExpr(con
11e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
11f0: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1200: 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d    setToken(&dumm
1210: 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  y, zName);.  ret
1220: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1230: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75  TK_ID, 0, 0, &du
1240: 6d 6d 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  mmy);.}.../*.** 
1250: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
1260: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
1270: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
1280: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
1290: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
12a0: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
12b0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
12c0: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
12d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
12e0: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e  WhereTerm(.  con
12f0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1300: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1310: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   the column */. 
1320: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1330: 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72  ab1,      /* Fir
1340: 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f  st table */.  co
1350: 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73  nst char *zAlias
1360: 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20  1,     /* Alias 
1370: 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e  for first table.
1380: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1390: 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a  .  const Table *
13a0: 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53  pTab2,      /* S
13b0: 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20  econd table */. 
13c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
13d0: 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias2,     /* Ali
13e0: 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61  as for second ta
13f0: 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  ble.  May be NUL
1400: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70  L */.  Expr **pp
1410: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1420: 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c  /* Add the equal
1430: 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73  ity term to this
1440: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
1450: 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20  {.  Expr *pE1a, 
1460: 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20  *pE1b, *pE1c;.  
1470: 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32  Expr *pE2a, *pE2
1480: 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72  b, *pE2c;.  Expr
1490: 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20   *pE;..  pE1a = 
14a0: 63 72 65 61 74 65 49 64 45 78 70 72 28 7a 43 6f  createIdExpr(zCo
14b0: 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 63 72 65  l);.  pE2a = cre
14c0: 61 74 65 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b  ateIdExpr(zCol);
14d0: 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d  .  if( zAlias1==
14e0: 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31  0 ){.    zAlias1
14f0: 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b   = pTab1->zName;
1500: 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 63 72  .  }.  pE1b = cr
1510: 65 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61  eateIdExpr(zAlia
1520: 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  s1);.  if( zAlia
1530: 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s2==0 ){.    zAl
1540: 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e  ias2 = pTab2->zN
1550: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20  ame;.  }.  pE2b 
1560: 3d 20 63 72 65 61 74 65 49 64 45 78 70 72 28 7a  = createIdExpr(z
1570: 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20  Alias2);.  pE1c 
1580: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1590: 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61  _DOT, pE1b, pE1a
15a0: 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73  , 0);.  pE2c = s
15b0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
15c0: 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30  T, pE2b, pE2a, 0
15d0: 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65  );.  pE = sqlite
15e0: 33 45 78 70 72 28 54 4b 5f 45 51 2c 20 70 45 31  3Expr(TK_EQ, pE1
15f0: 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 45  c, pE2c, 0);.  E
1600: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1610: 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  E, EP_FromJoin);
1620: 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c  .  *ppExpr = sql
1630: 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45  ite3ExprAnd(*ppE
1640: 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr, pE);.}../*.
1650: 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72  ** Set the EP_Fr
1660: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1670: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  on all terms of 
1680: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1690: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sion..**.** The 
16a0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
16b0: 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20  erty is used on 
16c0: 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72  terms of an expr
16d0: 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a  ession to tell.*
16e0: 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52  * the LEFT OUTER
16f0: 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67   JOIN processing
1700: 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73   logic that this
1710: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1720: 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73   the.** join res
1730: 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69  triction specifi
1740: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
1750: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64  USING clause and
1760: 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f   not a part.** o
1770: 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72  f the more gener
1780: 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  al WHERE clause.
1790: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72    These terms ar
17a0: 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20  e moved over to 
17b0: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
17c0: 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20  use during join 
17d0: 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77  processing but w
17e0: 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  e need to rememb
17f0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  er that they.** 
1800: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
1810: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
1820: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
1830: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
1840: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 77 68 69  (Expr *p){.  whi
1850: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70  le( p ){.    Exp
1860: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
1870: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1880: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
1890: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 20 3d  >pLeft);.    p =
18a0: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
18b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18c0: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
18d0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
18e0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
18f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1900: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1910: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
1920: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
1930: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
1940: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
1950: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
1960: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
1970: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
1980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
1990: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
19a0: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
19b0: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
19c0: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
19d0: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
19e0: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
19f0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
1a00: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
1a10: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
1a20: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
1a30: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
1a40: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
1a50: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
1a60: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
1a70: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
1a80: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
1a90: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
1aa0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
1ab0: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
1ac0: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
1ad0: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
1ae0: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
1af0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
1b00: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
1b10: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
1b20: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b30: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1b40: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
1b50: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1b60: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
1b70: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
1b80: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
1b90: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
1bc0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1bd0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
1be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c00: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
1c10: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c20: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
1c30: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
1c40: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
1c50: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1c60: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
1c70: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
1c80: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
1c90: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1ca0: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
1cb0: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
1cc0: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
1cd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
1ce0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
1cf0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
1d00: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
1d10: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
1d20: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
1d30: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
1d40: 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66  t->pTab;..    if
1d50: 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c  ( pLeftTab==0 ||
1d60: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20   pRightTab==0 ) 
1d70: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
1d80: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
1d90: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
1da0: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
1db0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
1dc0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
1dd0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
1de0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
1df0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
1e00: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e  .    if( pLeft->
1e10: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1e20: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
1e30: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c  f( pLeft->pOn ||
1e40: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
1e50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e70: 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  , "a NATURAL joi
1e80: 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22  n may not have "
1e90: 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20  .           "an 
1ea0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1eb0: 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  se", 0);.       
1ec0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
1ee0: 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43  ; j<pLeftTab->nC
1ef0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1f00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1f10: 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a  pLeftTab->aCol[j
1f20: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
1f30: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
1f40: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
1f50: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1f60: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
1f70: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
1f80: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
1f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1fb0: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
1fc0: 2d 3e 7a 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57  ->zAlias, &p->pW
1fd0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
1fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ff0: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
2000: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
2010: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
2020: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
2030: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2040: 3e 70 4f 6e 20 26 26 20 70 4c 65 66 74 2d 3e 70  >pOn && pLeft->p
2050: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
2060: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2070: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
2080: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
2090: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
20a0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
20b0: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
20c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
20e0: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
20f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
2100: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
2110: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
2120: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
2130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2140: 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 29 7b 0a 20   pLeft->pOn ){. 
2150: 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72       setJoinExpr
2160: 28 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20  (pLeft->pOn);.  
2170: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
2180: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
2190: 2d 3e 70 57 68 65 72 65 2c 20 70 4c 65 66 74 2d  ->pWhere, pLeft-
21a0: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 4c 65  >pOn);.      pLe
21b0: 66 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ft->pOn = 0;.   
21c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
21d0: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
21e0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
21f0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
2200: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
2210: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2220: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
2230: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2240: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
2250: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
2260: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
2270: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
2280: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
2290: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
22a0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
22b0: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
22c0: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
22d0: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
22e0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
22f0: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
2300: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
2310: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
2320: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
2330: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
2340: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
2350: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
2360: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
2370: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
2380: 74 20 3d 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e  t = pLeft->pUsin
2390: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
23a0: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
23b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
23c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73  ar *zName = pLis
23d0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
23e0: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
23f0: 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c  nIndex(pLeftTab,
2400: 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c   zName)<0 || col
2410: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2420: 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a  ab, zName)<0 ){.
2430: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2440: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2450: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
2460: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
2470: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
2480: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
2490: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
24a0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
24b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
24c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24d0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
24e0: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
24f0: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2520: 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a  htTab, pRight->z
2530: 41 6c 69 61 73 2c 20 26 70 2d 3e 70 57 68 65 72  Alias, &p->pWher
2540: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2550: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2570: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
2580: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
2590: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
25a0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
25b0: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
25c0: 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a 70  Delete(Select *p
25d0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
25e0: 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
25f0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2600: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
2610: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2620: 74 65 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73  te(p->pSrc);.  s
2630: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2640: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 73  (p->pWhere);.  s
2650: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2660: 6c 65 74 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  lete(p->pGroupBy
2670: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2680: 44 65 6c 65 74 65 28 70 2d 3e 70 48 61 76 69 6e  Delete(p->pHavin
2690: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g);.  sqlite3Exp
26a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
26b0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
26c0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
26d0: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 73 71  p->pPrior);.  sq
26e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
26f0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
2700: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2710: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 73  p->pOffset);.  s
2720: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2730: 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f  ./*.** Insert co
2740: 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74  de into "v" that
2750: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
2760: 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70  ecord on the top
2770: 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b   of the.** stack
2780: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
2790: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27a0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
27b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 56  Parse *pParse, V
27c0: 64 62 65 20 2a 76 2c 20 45 78 70 72 4c 69 73 74  dbe *v, ExprList
27d0: 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20 73   *pOrderBy){.  s
27e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
27f0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2800: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
2810: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2820: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
2830: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2c 20  OrderBy->nExpr, 
2840: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2850: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
2860: 74 49 6e 73 65 72 74 2c 20 30 2c 20 30 29 3b 0a  tInsert, 0, 0);.
2870: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
2880: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2890: 68 65 20 4f 46 46 53 45 54 20 61 6e 64 20 4c 49  he OFFSET and LI
28a0: 4d 49 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  MIT.*/.static vo
28b0: 69 64 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 0a  id codeLimiter(.
28c0: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
28d0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
28e0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
28f0: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
2900: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2910: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2920: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
2930: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
2940: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
2950: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
2960: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rent record */. 
2970: 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20 20 20   int iBreak,    
2980: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
2990: 74 6f 20 65 6e 64 20 74 68 65 20 6c 6f 6f 70 20  to end the loop 
29a0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 70 20 20 20  */.  int nPop   
29b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29c0: 20 6f 66 20 74 69 6d 65 73 20 74 6f 20 70 6f 70   of times to pop
29d0: 20 73 74 61 63 6b 20 77 68 65 6e 20 6a 75 6d 70   stack when jump
29e0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
29f0: 70 2d 3e 69 4f 66 66 73 65 74 3e 3d 30 20 29 7b  p->iOffset>=0 ){
2a00: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20  .    int addr = 
2a10: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2a20: 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
2a30: 20 20 20 69 66 28 20 6e 50 6f 70 3e 30 20 29 20     if( nPop>0 ) 
2a40: 61 64 64 72 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  addr++;.    sqli
2a50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2a60: 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 70 2d 3e 69  OP_MemIncr, p->i
2a70: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
2a80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a90: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
2aa0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
2ab0: 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f 70  r);.    if( nPop
2ac0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
2ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2ae0: 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30 29  OP_Pop, nPop, 0)
2af0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2b00: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2b10: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
2b20: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
2b30: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73  Comment((v, "# s
2b40: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
2b50: 64 73 22 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ds"));.  }.  if(
2b60: 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b   p->iLimit>=0 ){
2b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b80: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49  AddOp(v, OP_MemI
2b90: 6e 63 72 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ncr, p->iLimit, 
2ba0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  iBreak);.    Vdb
2bb0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
2bc0: 65 78 69 74 20 77 68 65 6e 20 4c 49 4d 49 54 20  exit when LIMIT 
2bd0: 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 7d 0a  reached"));.  }.
2be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2bf0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
2c00: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
2c10: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
2c20: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
2c30: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
2c40: 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43  If srcTab and nC
2c50: 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a  olumn are both z
2c60: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ero, then the pE
2c70: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
2c80: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
2c90: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
2ca0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
2cb0: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f  his row.  If nCo
2cc0: 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64  lumn>0.** then d
2cd0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
2ce0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
2cf0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
2d00: 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20  y to get the.** 
2d10: 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61  datatypes for ea
2d20: 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74  ch column..*/.st
2d30: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49  atic int selectI
2d40: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
2d50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2d60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2d70: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2d80: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2da0: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
2db0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2dc0: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
2dd0: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
2de0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
2df0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
2e00: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
2e10: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
2e20: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
2e30: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
2e40: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e60: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
2e70: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
2e80: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
2e90: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
2ea0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
2eb0: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
2ec0: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
2ed0: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
2ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
2ef0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
2f00: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
2f10: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ct */.  int eDes
2f20: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2f30: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
2f40: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
2f50: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c   */.  int iParm,
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f70: 20 41 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   An argument to 
2f80: 74 68 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74  the disposal met
2f90: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  hod */.  int iCo
2fa0: 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20  ntinue,         
2fb0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2fc0: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
2fd0: 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ext row */.  int
2fe0: 20 69 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20   iBreak,        
2ff0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
3000: 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
3010: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
3020: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20   */.  char *aff 
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3040: 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
3050: 20 69 66 20 65 44 65 73 74 20 69 73 20 53 52 54   if eDest is SRT
3060: 5f 55 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  _Union */.){.  V
3070: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
3080: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
3090: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
30a0: 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
30b0: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
30c0: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
30d0: 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20  esent */..  if( 
30e0: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  v==0 ) return 0;
30f0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
3100: 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  t!=0 );..  /* If
3110: 20 74 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d   there was a LIM
3120: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  IT clause on the
3130: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3140: 74 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63  t, then do the c
3150: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
3160: 20 69 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f   if this row sho
3170: 75 6c 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  uld be output.. 
3180: 20 2a 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63   */.  hasDistinc
3190: 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20  t = distinct>=0 
31a0: 26 26 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  && pEList && pEL
31b0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20  ist->nExpr>0;.  
31c0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
31d0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
31e0: 29 7b 0a 20 20 20 20 63 6f 64 65 4c 69 6d 69 74  ){.    codeLimit
31f0: 65 72 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  er(v, p, iContin
3200: 75 65 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  ue, iBreak, 0);.
3210: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
3220: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
3230: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
3240: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
3250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
3260: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
3270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3280: 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  Op(v, OP_Column,
3290: 20 73 72 63 54 61 62 2c 20 69 29 3b 0a 20 20 20   srcTab, i);.   
32a0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
32b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c 69 73 74  nColumn = pEList
32c0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c  ->nExpr;.    sql
32d0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
32e0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
32f0: 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ist);.  }..  /* 
3300: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
3310: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
3320: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
3330: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
3340: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
3350: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
3360: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
3370: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
3380: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
3390: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
33a0: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
33b0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 4c  .    int n = pEL
33c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 23 69 66 20  ist->nExpr;.#if 
33d0: 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54  NULL_ALWAYS_DIST
33e0: 49 4e 43 54 0a 20 20 20 20 73 71 6c 69 74 65 33  INCT.    sqlite3
33f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3400: 49 73 4e 75 6c 6c 2c 20 2d 70 45 4c 69 73 74 2d  IsNull, -pEList-
3410: 3e 6e 45 78 70 72 2c 20 73 71 6c 69 74 65 33 56  >nExpr, sqlite3V
3420: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
3430: 29 2b 37 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  )+7);.#endif.   
3440: 20 2f 2a 20 44 65 6c 69 62 65 72 61 74 65 6c 79   /* Deliberately
3450: 20 6c 65 61 76 65 20 74 68 65 20 61 66 66 69 6e   leave the affin
3460: 69 74 79 20 73 74 72 69 6e 67 20 6f 66 66 20 6f  ity string off o
3470: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
3480: 20 20 20 20 2a 2a 20 4f 50 5f 4d 61 6b 65 52 65      ** OP_MakeRe
3490: 63 6f 72 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cord */.    sqli
34a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
34b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d  OP_MakeRecord, -
34c0: 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
34d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
34e0: 50 5f 44 69 73 74 69 6e 63 74 2c 20 64 69 73 74  P_Distinct, dist
34f0: 69 6e 63 74 2c 20 73 71 6c 69 74 65 33 56 64 62  inct, sqlite3Vdb
3500: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
3510: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
3520: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3530: 6f 70 2c 20 6e 2b 31 2c 20 30 29 3b 0a 20 20 20  op, n+1, 0);.   
3540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3550: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
3560: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20   iContinue);.   
3570: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
3580: 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69   "# skip indisti
3590: 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a  nct records"));.
35a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
35b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
35c0: 73 65 72 74 2c 20 64 69 73 74 69 6e 63 74 2c 20  sert, distinct, 
35d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  0);.    if( pOrd
35e0: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
35f0: 20 63 6f 64 65 4c 69 6d 69 74 65 72 28 76 2c 20   codeLimiter(v, 
3600: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 69 42  p, iContinue, iB
3610: 72 65 61 6b 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  reak, nColumn);.
3620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
3630: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 23 69  tch( eDest ){.#i
3640: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3650: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
3660: 54 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  T.    /* In this
3670: 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63   mode, write eac
3680: 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  h query result t
3690: 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  o the key of the
36a0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a   temporary.    *
36b0: 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  * table iParm.. 
36c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
36d0: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
36e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36f0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
3700: 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55  ord, nColumn, NU
3710: 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53 54 49 4e  LL_ALWAYS_DISTIN
3720: 43 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CT);.      sqlit
3730: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
3740: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
3750: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
3760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3770: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
3780: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
37a0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
37b0: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
37c0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
37d0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
37e0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
37f0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
3800: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
3810: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
3820: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
3830: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
3840: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
3850: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
3860: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
3870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
3880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3890: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
38a0: 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f 41   nColumn, NULL_A
38b0: 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29 3b  LWAYS_DISTINCT);
38c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
38d0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
38e0: 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49 43  , aff, P3_STATIC
38f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3900: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3910: 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2c  NotFound, iParm,
3920: 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20 20   addr+3);.      
3930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3940: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
3950: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
3960: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3970: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72  dif..    /* Stor
3980: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
3990: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
39a0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
39b0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
39c0: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
39d0: 5f 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20  _TempTable: {.  
39e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
39f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3a00: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
3a10: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
3a20: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
3a30: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
3a40: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
3a50: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
3a60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3a70: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3a80: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
3a90: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rm, 0);.        
3aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3ab0: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
3ac0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
3ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3ae0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
3af0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
3b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3b10: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3b20: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3b30: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
3b40: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
3b50: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
3b60: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
3b70: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
3b80: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
3b90: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
3ba0: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
3bb0: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
3bc0: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
3bd0: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
3be0: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
3bf0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
3c00: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
3c10: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
3c20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
3c30: 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  v);.      int ad
3c40: 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  dr2;..      asse
3c50: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
3c60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
3c70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
3c80: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
3c90: 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  1+3);.      sqli
3ca0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
3cb0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
3cc0: 20 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c       addr2 = sql
3cd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ce0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
3cf0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
3d00: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rBy ){.        /
3d10: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
3d20: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
3d30: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
3d40: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
3d50: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
3d60: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
3d70: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
3d80: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
3d90: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
3da0: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
3db0: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
3dc0: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
3dd0: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
3de0: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
3df0: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
3e00: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
3e10: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
3e20: 73 65 2c 20 76 2c 20 70 4f 72 64 65 72 42 79 29  se, v, pOrderBy)
3e30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3e40: 20 20 20 20 20 20 20 63 68 61 72 20 61 66 66 20         char aff 
3e50: 3d 20 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78  = (iParm>>16)&0x
3e60: 46 46 3b 0a 20 20 20 20 20 20 20 20 61 66 66 20  FF;.        aff 
3e70: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
3e80: 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d  Affinity(pEList-
3e90: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[0].pExpr, aff
3ea0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
3eb0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
3ec0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
3ed0: 2c 20 26 61 66 66 2c 20 31 29 3b 0a 20 20 20 20  , &aff, 1);.    
3ee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3ef0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
3f00: 73 65 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30  sert, (iParm&0x0
3f10: 30 30 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20  000FFFF), 0);.  
3f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
3f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
3f40: 76 2c 20 61 64 64 72 32 2c 20 73 71 6c 69 74 65  v, addr2, sqlite
3f50: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3f60: 28 76 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  (v));.      brea
3f70: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
3f80: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
3f90: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
3fa0: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
3fb0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
3fc0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
3fd0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
3fe0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
3ff0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
4000: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4010: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
4020: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4030: 52 54 5f 45 78 69 73 74 73 3a 0a 20 20 20 20 63  RT_Exists:.    c
4040: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
4050: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
4060: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
4070: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
4080: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4090: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
40a0: 76 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  v, pOrderBy);.  
40b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
40c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
40d0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
40e0: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
40f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4100: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
4110: 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a  to, 0, iBreak);.
4120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4130: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4140: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
4150: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4160: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
4170: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
4180: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
4190: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
41a0: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
41b0: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
41c0: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
41d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
41e0: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
41f0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
4200: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
4210: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
4220: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4230: 54 5f 53 75 62 72 6f 75 74 69 6e 65 3a 0a 20 20  T_Subroutine:.  
4240: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
4250: 61 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ack:.    case SR
4260: 54 5f 53 6f 72 74 65 72 3a 20 7b 0a 20 20 20 20  T_Sorter: {.    
4270: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4280: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4290: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
42a0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
42b0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
42c0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
42d0: 28 70 50 61 72 73 65 2c 20 76 2c 20 70 4f 72 64  (pParse, v, pOrd
42e0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  erBy);.      }el
42f0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
4300: 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a  T_Subroutine ){.
4310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4320: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
4330: 6f 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b  osub, 0, iParm);
4340: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
4360: 65 73 74 21 3d 53 52 54 5f 53 6f 72 74 65 72 20  est!=SRT_Sorter 
4370: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4380: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4390: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
43a0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
43b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
43c0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
43d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
43e0: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
43f0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4400: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4410: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4420: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4430: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4440: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4450: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
4460: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
4470: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
4480: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
4490: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
44a0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
44b0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
44c0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
44d0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
44e0: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
44f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4500: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4510: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4520: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4530: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4540: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4550: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4560: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4570: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
4580: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
4590: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
45a0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
45b0: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
45c0: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
45d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
45e0: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
45f0: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
4600: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
4610: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
4620: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
4630: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
4640: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
4650: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
4660: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
4670: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
4680: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
4690: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
46a0: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
46b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
46c0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
46d0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
46e0: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
46f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4700: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
4710: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
4720: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
4730: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
4740: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   nColumn,     /*
4750: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
4760: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
4770: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
4780: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
4790: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
47a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  e */.  int iParm
47b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
47c0: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 61 73  nal parameter as
47d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 44  sociated with eD
47e0: 65 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  est */.){.  int 
47f0: 65 6e 64 31 20 3d 20 73 71 6c 69 74 65 33 56 64  end1 = sqlite3Vd
4800: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
4810: 20 20 69 6e 74 20 65 6e 64 32 20 3d 20 73 71 6c    int end2 = sql
4820: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4830: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
4840: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
4850: 66 6f 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  fo;.  ExprList *
4860: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
4870: 6e 43 6f 6c 2c 20 69 3b 0a 20 20 73 71 6c 69 74  nCol, i;.  sqlit
4880: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4890: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 65 44 65 73  >db;..  if( eDes
48a0: 74 3d 3d 53 52 54 5f 53 6f 72 74 65 72 20 29 20  t==SRT_Sorter ) 
48b0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 72 64 65 72  return;.  pOrder
48c0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
48d0: 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4f 72 64 65  ;.  nCol = pOrde
48e0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  rBy->nExpr;.  pI
48f0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nfo = sqliteMall
4900: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66  oc( sizeof(*pInf
4910: 6f 29 20 2b 20 6e 43 6f 6c 2a 28 73 69 7a 65 6f  o) + nCol*(sizeo
4920: 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
4930: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30  ;.  if( pInfo==0
4940: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e   ) return;.  pIn
4950: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
4960: 20 28 63 68 61 72 2a 29 26 70 49 6e 66 6f 2d 3e   (char*)&pInfo->
4970: 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  aColl[nCol];.  p
4980: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  Info->nField = n
4990: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
49a0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
49b0: 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 6c 61 74    /* If a collat
49c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
49d0: 20 73 70 65 63 69 66 69 65 64 20 65 78 70 6c 69   specified expli
49e0: 63 69 74 79 2c 20 74 68 65 6e 20 69 74 0a 20 20  city, then it.  
49f0: 20 20 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69    ** is stored i
4a00: 6e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  n pOrderBy->a[i]
4a10: 2e 7a 4e 61 6d 65 2e 20 4f 74 68 65 72 77 69 73  .zName. Otherwis
4a20: 65 2c 20 75 73 65 20 74 68 65 20 64 65 66 61 75  e, use the defau
4a30: 6c 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  lt.    ** collat
4a40: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 74 68 65  ion type for the
4a50: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20   expression..   
4a60: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61   */.    pInfo->a
4a70: 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65  Coll[i] = sqlite
4a80: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
4a90: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61  rse, pOrderBy->a
4aa0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
4ab0: 69 66 28 20 21 70 49 6e 66 6f 2d 3e 61 43 6f 6c  if( !pInfo->aCol
4ac0: 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 70 49  l[i] ){.      pI
4ad0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
4ae0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
4af0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4b00: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
4b10: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
4b20: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ortOrder;.  }.  
4b30: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
4b40: 2c 20 4f 50 5f 53 6f 72 74 2c 20 30 2c 20 30 2c  , OP_Sort, 0, 0,
4b50: 20 28 63 68 61 72 2a 29 70 49 6e 66 6f 2c 20 50   (char*)pInfo, P
4b60: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
4b70: 46 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  F);.  addr = sql
4b80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4b90: 20 4f 50 5f 53 6f 72 74 4e 65 78 74 2c 20 30 2c   OP_SortNext, 0,
4ba0: 20 65 6e 64 31 29 3b 0a 20 20 63 6f 64 65 4c 69   end1);.  codeLi
4bb0: 6d 69 74 65 72 28 76 2c 20 70 2c 20 61 64 64 72  miter(v, p, addr
4bc0: 2c 20 65 6e 64 32 2c 20 31 29 3b 0a 20 20 73 77  , end2, 1);.  sw
4bd0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4be0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4bf0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4c00: 54 65 6d 70 54 61 62 6c 65 3a 20 7b 0a 20 20 20  TempTable: {.   
4c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c20: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  dOp(v, OP_NewRow
4c30: 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20  id, iParm, 0);. 
4c40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4c50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4c60: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
4c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4c80: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
4c90: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  arm, 0);.      b
4ca0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
4cb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4cc0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
4cd0: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
4ce0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
4cf0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
4d00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4d10: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
4d20: 31 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  1, sqlite3VdbeCu
4d30: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
4d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
4d60: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
4d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d80: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
4d90: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
4da0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
4db0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
4dc0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4dd0: 6f 72 64 2c 20 31 2c 20 30 2c 20 22 6e 22 2c 20  ord, 1, 0, "n", 
4de0: 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
4df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4e00: 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  Op(v, OP_IdxInse
4e10: 72 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30  rt, (iParm&0x000
4e20: 30 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20  0FFFF), 0);.    
4e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4e40: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
4e50: 74 73 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ts:.    case SRT
4e60: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
4e70: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4e80: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4e90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4ea0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50 61 72 6d  _MemStore, iParm
4eb0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
4ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4ed0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 31  OP_Goto, 0, end1
4ee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4ef0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
4f00: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
4f10: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
4f20: 5f 53 75 62 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  _Subroutine: {. 
4f30: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
4f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f50: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
4f60: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
4f70: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
4f80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4f90: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
4fa0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
4fb0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
4fc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4fd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4fe0: 5f 43 6f 6c 75 6d 6e 2c 20 2d 31 2d 69 2c 20 69  _Column, -1-i, i
4ff0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5000: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
5010: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
5020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5030: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 61 6c 6c 62  ddOp(v, OP_Callb
5040: 61 63 6b 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  ack, nColumn, 0)
5050: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5070: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
5080: 73 75 62 2c 20 30 2c 20 69 50 61 72 6d 29 3b 0a  sub, 0, iParm);.
5090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
50a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
50b0: 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b  , OP_Pop, 2, 0);
50c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50d0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
50e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
50f0: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
5100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
5110: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5120: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
5130: 30 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  0, addr);.  sqli
5140: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
5150: 62 65 6c 28 76 2c 20 65 6e 64 32 29 3b 0a 20 20  bel(v, end2);.  
5160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5170: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
5180: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5190: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
51a0: 65 6e 64 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  end1);.  sqlite3
51b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
51c0: 53 6f 72 74 52 65 73 65 74 2c 20 30 2c 20 30 29  SortReset, 0, 0)
51d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
51e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
51f0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
5200: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
5210: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
5220: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
5230: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
5240: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
5250: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
5260: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
5270: 66 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  f the declaratio
5280: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
5290: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
52a0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
52b0: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 6f 72  d from.** the or
52c0: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
52d0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
52e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
52f0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  is a column..** 
5300: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
5310: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 20  ion type for an 
5320: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 69  expression is ei
5330: 74 68 65 72 20 54 45 58 54 2c 20 4e 55 4d 45 52  ther TEXT, NUMER
5340: 49 43 20 6f 72 20 41 4e 59 2e 0a 2a 2a 20 54 68  IC or ANY..** Th
5350: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
5360: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
5370: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
5380: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5390: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
53a0: 65 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  e(NameContext *p
53b0: 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
53c0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
53d0: 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 6a 3b 0a  zType;.  int j;.
53e0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
53f0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
5400: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
5410: 20 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f    /* The TK_AS o
5420: 70 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79  perator can only
5430: 20 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20   occur in ORDER 
5440: 42 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41  BY, GROUP BY, HA
5450: 56 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c  VING,.  ** and L
5460: 49 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42  IMIT clauses.  B
5470: 75 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61  ut pExpr origina
5480: 74 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  tes in the resul
5490: 74 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20  t set of a.  ** 
54a0: 53 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70  SELECT.  So pExp
54b0: 72 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74  r can never cont
54c0: 61 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74  ain an AS operat
54d0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  or..  */.  asser
54e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
54f0: 5f 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  _AS );..  switch
5500: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
5510: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
5520: 4e 3a 20 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  N: {.      Table
5530: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
5540: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
5550: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
5560: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
5570: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
5580: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
5590: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
55a0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
55b0: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
55c0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
55d0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
55e0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
55f0: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
5600: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
5610: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
5620: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
5630: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
5640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5650: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
5660: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
5670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5680: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
5690: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
56a0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
56b0: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
56c0: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
56d0: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
56e0: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
56f0: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
5700: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
5710: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
5720: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
5730: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
5740: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
5750: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
5760: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
5770: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
5780: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
5790: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
57a0: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
57b0: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
57c0: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
57d0: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
57e0: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
57f0: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
5800: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
5810: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
5820: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
5830: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
5840: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
5850: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
5860: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
5870: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
5880: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
5890: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
58a0: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
58b0: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
58c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
58d0: 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a  assert( pTab );.
58e0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
58f0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
5900: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73  iPKey;.      ass
5910: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
5920: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
5930: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
5940: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
5950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 54 79  0 ){.        zTy
5960: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
5970: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5980: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
5990: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
59a0: 79 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ype;.      }.   
59b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
59c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
59d0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
59e0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
59f0: 20 7b 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e   {.      NameCon
5a00: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
5a10: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
5a20: 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  pr->pSelect;.   
5a30: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
5a40: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
5a50: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
5a60: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
5a70: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
5a80: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 53  umnType(&sNC, pS
5a90: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
5aa0: 45 78 70 72 29 3b 20 0a 20 20 20 20 20 20 62 72  Expr); .      br
5ab0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5ac0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  f.    default:. 
5ad0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 30 3b 0a       zType = 0;.
5ae0: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
5af0: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
5b00: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
5b10: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
5b20: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
5b30: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
5b40: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
5b50: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
5b60: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
5b70: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
5b80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5b90: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
5ba0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
5bb0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
5bc0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
5bd0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
5be0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
5bf0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
5c00: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
5c10: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
5c20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5c30: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5c40: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
5c50: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
5c60: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 66 6f  = pTabList;.  fo
5c70: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
5c80: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5c90: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
5ca0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
5cb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5cc0: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
5cd0: 70 65 28 26 73 4e 43 2c 20 70 29 3b 0a 20 20 20  pe(&sNC, p);.   
5ce0: 20 69 66 28 20 7a 54 79 70 65 3d 3d 30 20 29 20   if( zType==0 ) 
5cf0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 2f 2a  continue;.    /*
5d00: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
5d10: 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f 70  ake it's own cop
5d20: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
5d30: 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74 68  type, in case th
5d40: 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d 61  e .    ** schema
5d50: 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65   is reset before
5d60: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
5d70: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
5d80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5d90: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
5da0: 6d 65 28 76 2c 20 69 2b 70 45 4c 69 73 74 2d 3e  me(v, i+pEList->
5db0: 6e 45 78 70 72 2c 20 7a 54 79 70 65 2c 20 73 74  nExpr, zType, st
5dc0: 72 6c 65 6e 28 7a 54 79 70 65 29 29 3b 0a 20 20  rlen(zType));.  
5dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
5de0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
5df0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
5e00: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
5e10: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
5e20: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
5e30: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
5e40: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
5e50: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
5e60: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
5e70: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
5e80: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
5e90: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
5ea0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5eb0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
5ec0: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
5ed0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
5ee0: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
5ef0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5f00: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
5f10: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
5f20: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
5f30: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5f40: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5f50: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
5f60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5f70: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
5f80: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
5f90: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
5fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5fb0: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
5fc0: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
5fd0: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
5fe0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
5ff0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
6000: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
6010: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
6020: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
6030: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
6040: 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
6050: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 20  malloc_failed ) 
6060: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
6070: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
6080: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
6090: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
60a0: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
60b0: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
60c0: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
60d0: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
60e0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
60f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
6100: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
6110: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
6120: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
6130: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
6140: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
6150: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6160: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
6170: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6180: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
6190: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
61a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
61b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
61c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
61d0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
61e0: 20 69 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65   i, zName, strle
61f0: 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  n(zName));.     
6200: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
6210: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
6220: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61  TK_COLUMN && pTa
6230: 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54  bList ){.      T
6240: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
6250: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
6260: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
6270: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
6280: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
6290: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
62a0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
62b0: 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b  rsor!=p->iTable;
62c0: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73   j++){}.      as
62d0: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
62e0: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
62f0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
6300: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
6310: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
6320: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
6330: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
6340: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
6350: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
6360: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
6370: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
6380: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
6390: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
63a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
63b0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
63c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
63d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
63e0: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
63f0: 75 6c 6c 4e 61 6d 65 73 20 26 26 20 70 2d 3e 73  ullNames && p->s
6400: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
6410: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  .z[0] ){.       
6420: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
6430: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e  olName(v, i, p->
6440: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
6450: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
6460: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
6470: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
6480: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
6490: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
64a0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
64b0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
64c0: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
64d0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
64e0: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
64f0: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
6500: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
6510: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
6520: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6530: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
6540: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
6550: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ol, 0);.        
6560: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6570: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
6580: 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
6590: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
65a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
65b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
65c0: 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43   zCol, strlen(zC
65d0: 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol));.      }.  
65e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
65f0: 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e  pan.z && p->span
6600: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73  .z[0] ){.      s
6610: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
6620: 4e 61 6d 65 28 76 2c 20 69 2c 20 70 2d 3e 73 70  Name(v, i, p->sp
6630: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
6640: 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
6650: 65 33 56 64 62 65 43 6f 6d 70 72 65 73 73 53 70  e3VdbeCompressSp
6660: 61 63 65 28 76 2c 20 61 64 64 72 29 3b 20 2a 2f  ace(v, addr); */
6670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6680: 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 30 5d    char zName[30]
6690: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
66a0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
66b0: 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d 3d 30 20   || pTabList==0 
66c0: 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  );.      sprintf
66d0: 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25  (zName, "column%
66e0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
66f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
6700: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 7a 4e 61 6d  lName(v, i, zNam
6710: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
6720: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
6730: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
6740: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
6750: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
6760: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6770: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
6780: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
6790: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
67a0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
67b0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
67c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
67d0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
67e0: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
67f0: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
6800: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
6810: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
6820: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
6830: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
6840: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
6850: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
6860: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
6870: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
6880: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
6890: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
68a0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
68b0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
68c0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
68d0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
68e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
68f0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
6900: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
6910: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
6920: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
6930: 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53  ctStmt(Parse*, S
6940: 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  elect*);../*.** 
6950: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
6960: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
6970: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
6980: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
6990: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
69a0: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
69b0: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
69c0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
69d0: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
69e0: 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54  pParse, char *zT
69f0: 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a  abName, Select *
6a00: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
6a10: 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69  e *pTab;.  int i
6a20: 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  , j;.  ExprList 
6a30: 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d  *pEList;.  Colum
6a40: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a  n *aCol, *pCol;.
6a50: 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63  .  if( prepSelec
6a60: 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53  tStmt(pParse, pS
6a70: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72 65  elect) ){.    re
6a80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
6a90: 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
6aa0: 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
6ab0: 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20 20  Select, 0) ){.  
6ac0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6ad0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 4d    pTab = sqliteM
6ae0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54 61  alloc( sizeof(Ta
6af0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
6b00: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
6b10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
6b20: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
6b30: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61  Tab->zName = zTa
6b40: 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53 74  bName ? sqliteSt
6b50: 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a  rDup(zTabName) :
6b60: 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
6b70: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
6b80: 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70    pTab->nCol = p
6b90: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
6ba0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
6bb0: 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e  ol>0 );.  pTab->
6bc0: 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71  aCol = aCol = sq
6bd0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
6be0: 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d  of(pTab->aCol[0]
6bf0: 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  )*pTab->nCol );.
6c00: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
6c10: 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
6c20: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
6c30: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20 2a  {.    Expr *p, *
6c40: 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  pR;.    char *zT
6c50: 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ype;.    char *z
6c60: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
6c70: 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20 20 20 69  zBasename;.    i
6c80: 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d 65  nt cnt;.    Name
6c90: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
6ca0: 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20   .    /* Get an 
6cb0: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
6cc0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
6cd0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
6ce0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
6cf0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
6d00: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->pRight==0 || p
6d10: 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  ->pRight->token.
6d20: 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  z==0 || p->pRigh
6d30: 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30  t->token.z[0]!=0
6d40: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61   );.    if( (zNa
6d50: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
6d60: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
6d70: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
6d80: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
6d90: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
6da0: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
6db0: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
6dc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
6dd0: 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d 65  liteStrDup(zName
6de0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
6df0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 0a   p->op==TK_DOT .
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
6e10: 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29 21   (pR=p->pRight)!
6e20: 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  =0 && pR->token.
6e30: 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e 7a  z && pR->token.z
6e40: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  [0] ){.      /* 
6e50: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  For columns of t
6e60: 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65 20  he from A.B use 
6e70: 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  B as the name */
6e80: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
6e90: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
6ea0: 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29 3b  T", &pR->token);
6eb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
6ec0: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
6ed0: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
6ee0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
6ef0: 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
6f00: 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
6f10: 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
6f20: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
6f30: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
6f40: 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29 3b  "%T", &p->span);
6f50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6f60: 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73 65    /* If all else
6f70: 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70 20   fails, make up 
6f80: 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  a name */.      
6f90: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
6fa0: 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25 64  Printf("column%d
6fb0: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  ", i+1);.    }. 
6fc0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
6fd0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  e(zName);.    if
6fe0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
6ff0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  _failed ){.     
7000: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61 6d   sqliteFree(zNam
7010: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
7020: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
7030: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74  pTab);.      ret
7040: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
7050: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
7060: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
7070: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
7080: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
7090: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
70a0: 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f  end a integer to
70b0: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
70c0: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
70d0: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
70e0: 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61 6d  zBasename = zNam
70f0: 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74  e;.    for(j=cnt
7100: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
7110: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7120: 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e  StrICmp(aCol[j].
7130: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
7140: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   ){.        zNam
7150: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
7160: 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61 73  tf("%s:%d", zBas
7170: 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  ename, ++cnt);. 
7180: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
7190: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
71a0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
71b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
71c0: 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a 4e  f( zBasename!=zN
71d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
71e0: 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61 6d  iteFree(zBasenam
71f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  e);.    }.    pC
7200: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
7210: 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  e;..    /* Get t
7220: 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79 70  he typename, typ
7230: 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 20  e affinity, and 
7240: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
7250: 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  ce for the.    *
7260: 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f  * column..    */
7270: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
7280: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
7290: 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  );.    sNC.pSrcL
72a0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
72b0: 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  Src;.    zType =
72c0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63 6f   sqliteStrDup(co
72d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
72e0: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  ));.    pCol->zT
72f0: 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20  ype = zType;.   
7300: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
7310: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
7320: 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43  inity(p);.    pC
7330: 6f 6c 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->pColl = sqli
7340: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
7350: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
7360: 66 28 20 21 70 43 6f 6c 2d 3e 70 43 6f 6c 6c 20  f( !pCol->pColl 
7370: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  ){.      pCol->p
7380: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
7390: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
73a0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
73b0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 72 65  iPKey = -1;.  re
73c0: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
73d0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53 45  .** Prepare a SE
73e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
73f0: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79  or processing by
7400: 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   doing the follo
7410: 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73 3a 0a  wing.** things:.
7420: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
7430: 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
7440: 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
7450: 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
7460: 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
7470: 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
7480: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
7490: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
74a0: 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
74b0: 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
74c0: 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
74d0: 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
74e0: 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
74f0: 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
7500: 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
7510: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
7520: 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
7530: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
7540: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
7550: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
7560: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
7570: 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
7580: 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
7590: 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
75a0: 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
75b0: 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
75c0: 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
75d0: 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
75e0: 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
75f0: 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
7600: 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
7610: 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
7620: 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
7630: 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
7640: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
7650: 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
7660: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
7670: 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
7680: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
7690: 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
76a0: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
76b0: 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
76c0: 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
76d0: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
76e0: 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
76f0: 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
7700: 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
7710: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7720: 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
7730: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
7740: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
7750: 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
7760: 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
7770: 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
7780: 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
7790: 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
77a0: 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
77b0: 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
77c0: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
77d0: 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
77e0: 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
77f0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  LE..**.** Return
7800: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20   0 on success.  
7810: 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72 6f  If there are pro
7820: 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61 6e 20  blems, leave an 
7830: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
7840: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
7850: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
7860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
7870: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
7880: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
7890: 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ct *p){.  int i,
78a0: 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53 72 63   j, k, rc;.  Src
78b0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
78c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
78d0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
78e0: 62 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  b;.  struct SrcL
78f0: 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
7900: 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
7910: 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20 73 71  p->pSrc==0 || sq
7920: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
7930: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
7940: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
7950: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
7960: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
7970: 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
7980: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
7990: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
79a0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
79b0: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
79c0: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
79d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
79e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
79f0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
7a00: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
7a10: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
7a20: 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
7a30: 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
7a40: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
7a50: 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
7a60: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
7a70: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
7a80: 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
7a90: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
7aa0: 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
7ab0: 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
7ac0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
7ad0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
7ae0: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
7af0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
7b00: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
7b10: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
7b20: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
7b30: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
7b40: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
7b50: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
7b60: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7b70: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
7b80: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
7b90: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
7ba0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
7bb0: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
7bc0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
7bd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
7be0: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
7bf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c00: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7c10: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
7c20: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
7c30: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
7c40: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
7c50: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
7c60: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
7c70: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
7c80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
7c90: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
7ca0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
7cb0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
7cc0: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
7cd0: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
7ce0: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
7cf0: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
7d00: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
7d10: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
7d20: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
7d30: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
7d40: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
7d50: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
7d60: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
7d70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
7d80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7d90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7da0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
7db0: 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20 69  Transient flag i
7dc0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
7dd0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
7de0: 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  e has been.     
7df0: 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20   ** dynamically 
7e00: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d 61  allocated and ma
7e10: 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61 6e  y be freed at an
7e20: 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68 65  y time.  In othe
7e30: 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20 2a  r words,.      *
7e40: 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70 6f  * pTab is not po
7e50: 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72 73  inting to a pers
7e60: 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74 72  istent table str
7e70: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66 69  ucture that defi
7e80: 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 72  nes.      ** par
7e90: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e  t of the schema.
7ea0: 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   */.      pTab->
7eb0: 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31 3b  isTransient = 1;
7ec0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
7ed0: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
7ee0: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
7ef0: 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
7f00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
7f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7f20: 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
7f30: 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
7f40: 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
7f50: 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
7f60: 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70  teTable(pParse,p
7f70: 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f  From->zName,pFro
7f80: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
7f90: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
7fa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7fb0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
7fc0: 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
7fd0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
7fe0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 20  _OMIT_VIEW.     
7ff0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
8000: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
8010: 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
8020: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
8030: 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
8040: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
8050: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
8060: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
8070: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
8080: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
8090: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
80a0: 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
80b0: 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
80c0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
80d0: 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
80e0: 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
80f0: 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
8100: 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
8110: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
8120: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
8130: 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
8140: 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
8150: 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
8160: 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
8170: 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
8180: 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
8190: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
81a0: 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
81b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
81c0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
81d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 54  ite3SelectDup(pT
81e0: 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab->pSelect);.  
81f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8200: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
8210: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
8220: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
8230: 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
8240: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
8250: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ns..  */.  if( s
8260: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
8270: 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72 65  (pParse, p) ) re
8280: 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f  turn 1;..  /* Fo
8290: 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
82a0: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
82b0: 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
82c0: 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
82d0: 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
82e0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
82f0: 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
8300: 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
8310: 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
8320: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
8330: 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
8340: 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
8350: 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
8360: 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
8370: 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
8380: 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
8390: 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
83a0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
83b0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
83c0: 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
83d0: 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
83e0: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
83f0: 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
8400: 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
8410: 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
8420: 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
8430: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
8440: 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
8450: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
8460: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
8470: 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
8480: 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
8490: 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
84a0: 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
84b0: 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
84c0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
84d0: 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
84e0: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
84f0: 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
8500: 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
8510: 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
8520: 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
8530: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
8540: 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
8550: 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
8560: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
8570: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20  break;.  }.  rc 
8580: 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c  = 0;.  if( k<pEL
8590: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
85a0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77    /*.    ** If w
85b0: 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65  e get here it me
85c0: 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  ans the result s
85d0: 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  et contains one 
85e0: 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20  or more "*".    
85f0: 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  ** operators tha
8600: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
8610: 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72  anded.  Loop thr
8620: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
8630: 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  sion.    ** in t
8640: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
8650: 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e  d expand them on
8660: 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f  e by one..    */
8670: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
8680: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70  List_item *a = p
8690: 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78  EList->a;.    Ex
86a0: 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30  prList *pNew = 0
86b0: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  ;.    int flags 
86c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  = pParse->db->fl
86d0: 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e  ags;.    int lon
86e0: 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20  gNames = (flags 
86f0: 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c  & SQLITE_FullCol
8700: 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20  Names)!=0 &&.   
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49     (flags & SQLI
8730: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
8740: 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b  )==0;..    for(k
8750: 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
8760: 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  xpr; k++){.     
8770: 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d   Expr *pE = a[k]
8780: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
8790: 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
87a0: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28   &&.           (
87b0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
87c0: 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20  | pE->pRight==0 
87d0: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  || pE->pRight->o
87e0: 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
87f0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
8800: 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
8810: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
8820: 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
8830: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8840: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
8850: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8860: 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  d(pNew, a[k].pEx
8870: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
8880: 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
8890: 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61  xpr-1].zName = a
88a0: 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [k].zName;.     
88b0: 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
88c0: 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
88d0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
88e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
88f0: 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
8900: 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
8910: 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
8920: 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
8930: 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
8940: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
8950: 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
8960: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
8970: 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
8980: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
8990: 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
89a0: 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
89b0: 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
89c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
89d0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
89e0: 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
89f0: 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
8a00: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
8a10: 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d  oken(&pE->pLeft-
8a20: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
8a30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8a40: 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20    zTName = 0;.  
8a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8a60: 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
8a70: 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
8a80: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
8a90: 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
8aa0: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
8ab0: 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
8ac0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
8ad0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
8ae0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
8af0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
8b00: 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d  me==0 || zTabNam
8b10: 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20  e[0]==0 ){ .    
8b20: 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
8b30: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8b40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8b50: 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
8b60: 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30   && (zTabName==0
8b70: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
8b80: 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
8b90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
8ba0: 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
8bb0: 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a  TabName)!=0) ){.
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8bd0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8be0: 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  }.          tabl
8bf0: 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  eSeen = 1;.     
8c00: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8c10: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
8c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
8c30: 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 4c 65 66  pr *pExpr, *pLef
8c40: 74 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  t, *pRight;.    
8c50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8c60: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
8c70: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  [j].zName;..    
8c80: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
8c90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8ca0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8cb0: 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70  item *pLeft = &p
8cc0: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b  TabList->a[i-1];
8cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
8ce0: 66 28 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  f( (pLeft->joint
8cf0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
8d00: 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d20: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
8d30: 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
8d40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8d50: 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
8d60: 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
8d70: 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
8d80: 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
8da0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
8db0: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
8dc0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8df0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
8e00: 64 65 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e  dex(pLeft->pUsin
8e10: 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
8e40: 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
8e50: 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
8e60: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
8e70: 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
8e80: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
8e90: 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
8ea0: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
8eb0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8ee0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
8ef0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
8f00: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  K_ID, 0, 0, 0);.
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8f20: 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61  pRight==0 ) brea
8f30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  k;.            s
8f40: 65 74 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d  etToken(&pRight-
8f50: 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a  >token, zName);.
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
8f70: 7a 54 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e  zTabName && (lon
8f80: 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
8f90: 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20  st->nSrc>1) ){. 
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
8fb0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
8fc0: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
8fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8fe0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8ff0: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
9000: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
9020: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
9030: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
9040: 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74   setToken(&pLeft
9050: 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d  ->token, zTabNam
9060: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
9070: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70    setToken(&pExp
9080: 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33  r->span, sqlite3
9090: 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c  MPrintf("%s.%s",
90a0: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
90b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
90c0: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
90d0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
90e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
90f0: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
9100: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
9110: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
9120: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
9130: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
9140: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
9150: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9160: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
9180: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
9190: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
91a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
91b0: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
91c0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
91d0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
91e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
91f0: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
9200: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
9210: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
9230: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
9240: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
9250: 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
9260: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
9270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9280: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
9290: 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
92a0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
92b0: 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
92c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
92d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
92e0: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
92f0: 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
9300: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9320: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9330: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
9340: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
9350: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9360: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
9370: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
9380: 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b  iteFree(zTName);
9390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
93a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
93b0: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
93c0: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
93d0: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
93e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
93f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9400: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
9410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9420: 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e  ne associates en
9430: 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45  tries in an ORDE
9440: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
9450: 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c  list with.** col
9460: 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74  umns in a result
9470: 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45  .  For each ORDE
9480: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  R BY expression,
9490: 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a   the opcode of.*
94a0: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
94b0: 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  node is changed 
94c0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
94d0: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c   the iColumn val
94e0: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  ue of.** the top
94f0: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
9500: 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f  illed in with co
9510: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20  lumn number and 
9520: 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61  the iTable.** va
9530: 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  lue of the top-l
9540: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
9550: 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20  led with iTable 
9560: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
9570: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
9580: 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73  ior SELECT claus
9590: 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f  es, they are pro
95a0: 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41  cessed first.  A
95b0: 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20   match.** in an 
95c0: 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74  earlier SELECT t
95d0: 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20  akes precedence 
95e0: 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c  over a later SEL
95f0: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ECT..**.** Any e
9600: 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e  ntry that does n
9610: 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67  ot match is flag
9620: 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ged as an error.
9630: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
9640: 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  of errors is ret
9650: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
9660: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
9670: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
9680: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9690: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
96a0: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
96b0: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
96c0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
96d0: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
96e0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
96f0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
9700: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
9710: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
9720: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
9730: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
9740: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
9750: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
9760: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
9770: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
9780: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
9790: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
97a0: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
97b0: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
97c0: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
97d0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
97e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
97f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
9800: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
9810: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
9820: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9830: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
9840: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
9850: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
9860: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
9870: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
9880: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65   }.  }.  if( pre
9890: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
98a0: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
98b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
98c0: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
98d0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
98e0: 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  f( matchOrderbyT
98f0: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
9900: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
9910: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
9920: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
9930: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
9940: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
9950: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
9960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
9970: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
9980: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
9990: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
99a0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  .pExpr;.    int 
99b0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iCol = -1;.    i
99c0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
99d0: 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ].done ) continu
99e0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
99f0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
9a00: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
9a10: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
9a20: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
9a30: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
9a40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9a50: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
9a60: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
9a70: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
9a80: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
9a90: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
9aa0: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
9ab0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
9ac0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
9ad0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9ae0: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
9af0: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
9b00: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
9b10: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
9b20: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
9b30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
9b40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
9b50: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
9b60: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
9b70: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
9b80: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
9b90: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
9ba0: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
9bb0: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
9bc0: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
9bd0: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
9be0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9bf0: 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  en(&pE->token);.
9c00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c10: 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20  zLabel!=0 );.   
9c20: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9c30: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
9c40: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
9c50: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
9c60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9c70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9c80: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
9c90: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
9ca0: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
9cb0: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
9cc0: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
9cd0: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
9ce0: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
9cf0: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
9d00: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
9d10: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
9d20: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
9d30: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
9d40: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
9d50: 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41  le;.      pE->iA
9d60: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  gg = -1;.      p
9d70: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
9d80: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
9d90: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
9da0: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
9db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9dc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
9dd0: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
9de0: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
9df0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
9e00: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
9e10: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
9e20: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
9e30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
9e40: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
9e50: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
9e60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9e70: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9e80: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
9e90: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
9ea0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
9eb0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
9ec0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
9ed0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
9ee0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
9ef0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
9f00: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
9f10: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
9f20: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
9f30: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
9f40: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
9f50: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
9f60: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
9f70: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
9f80: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
9f90: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
9fa0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 2f 2a   return v;.}../*
9fb0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
9fc0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
9fd0: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
9fe0: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
9ff0: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
a000: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
a010: 73 73 69 6f 6e 73 2e 20 20 6e 4c 69 6d 69 74 20  ssions.  nLimit 
a020: 61 6e 64 20 6e 4f 66 66 73 65 74 20 68 6f 6c 64  and nOffset hold
a030: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
a040: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
a050: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
a060: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
a070: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
a080: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
a090: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
a0a0: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
a0b0: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
a0c0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a0d0: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
a0e0: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
a0f0: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
a100: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
a110: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
a120: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
a130: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
a140: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
a150: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
a160: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
a170: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
a180: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a190: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
a1a0: 65 20 76 61 6c 75 65 73 20 69 66 20 69 4c 69 6d  e values if iLim
a1b0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
a1c0: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
a1d0: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
a1e0: 65 66 69 6e 65 64 20 62 79 20 6e 4c 69 6d 69 74  efined by nLimit
a1f0: 20 61 6e 64 20 6e 4f 66 66 73 65 74 2e 20 20 69   and nOffset.  i
a200: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
a210: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
a220: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
a230: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
a240: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
a250: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
a260: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
a270: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
a280: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
a290: 20 69 66 20 6e 4c 69 6d 69 74 3e 3d 30 20 6f 72   if nLimit>=0 or
a2a0: 20 6e 4f 66 66 73 65 74 3e 30 20 64 6f 20 74 68   nOffset>0 do th
a2b0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
a2c0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
a2d0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
a2e0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
a2f0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
a300: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
a310: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
a320: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
a330: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
a340: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
a350: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
a360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a370: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
a380: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
a390: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
a3a0: 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  {.  /* .  ** "LI
a3b0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
a3c0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
a3d0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
a3e0: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
a3f0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
a400: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
a410: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
a420: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
a430: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
a440: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
a450: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
a460: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
a470: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
a480: 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70 50 61 72   int iMem = pPar
a490: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
a4a0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
a4b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
a4c0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
a4d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
a4e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a4f0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  rse, p->pLimit);
a500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a510: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
a520: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
a530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a540: 4f 70 28 76 2c 20 4f 50 5f 4e 65 67 61 74 69 76  Op(v, OP_Negativ
a550: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  e, 0, 0);.    sq
a560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a570: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
a580: 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 56 64 62  Mem, 1);.    Vdb
a590: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
a5a0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
a5b0: 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  ;.    p->iLimit 
a5c0: 3d 20 69 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  = iMem;.  }.  if
a5d0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
a5e0: 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 70      int iMem = p
a5f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
a600: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
a610: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
a620: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
a630: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a640: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a650: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
a660: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
a670: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a680: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
a690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a6a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 67  eAddOp(v, OP_Neg
a6b0: 61 74 69 76 65 2c 20 30 2c 20 30 29 3b 0a 20 20  ative, 0, 0);.  
a6c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a6d0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
a6e0: 65 2c 20 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20  e, iMem, 1);.   
a6f0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a700: 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74   "# OFFSET count
a710: 65 72 22 29 29 3b 0a 20 20 20 20 70 2d 3e 69 4f  er"));.    p->iO
a720: 66 66 73 65 74 20 3d 20 69 4d 65 6d 3b 0a 20 20  ffset = iMem;.  
a730: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a740: 61 74 65 20 56 44 42 45 20 69 6e 73 74 72 75 63  ate VDBE instruc
a750: 74 69 6f 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  tions that will 
a760: 6f 70 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  open a transient
a770: 20 74 61 62 6c 65 20 74 68 61 74 0a 2a 2a 20 77   table that.** w
a780: 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
a790: 61 6e 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 73  an index or to s
a7a0: 74 6f 72 65 20 6b 65 79 65 64 20 72 65 73 75 6c  tore keyed resul
a7b0: 74 73 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  ts for a compoun
a7c0: 64 0a 2a 2a 20 73 65 6c 65 63 74 2e 20 20 49 6e  d.** select.  In
a7d0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6f 70   other words, op
a7e0: 65 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  en a transient t
a7f0: 61 62 6c 65 20 74 68 61 74 20 6e 65 65 64 73 20  able that needs 
a800: 61 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  a.** KeyInfo str
a810: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6e 75 6d  ucture.  The num
a820: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
a830: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 69 73  n the KeyInfo is
a840: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
a850: 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  y the result set
a860: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
a870: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
a880: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
a890: 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 69 63 61  .**.** Specifica
a8a0: 6c 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lly, this routin
a8b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  e is called to o
a8c0: 70 65 6e 20 61 6e 20 69 6e 64 65 78 20 74 61 62  pen an index tab
a8d0: 6c 65 20 66 6f 72 0a 2a 2a 20 44 49 53 54 49 4e  le for.** DISTIN
a8e0: 43 54 2c 20 55 4e 49 4f 4e 2c 20 49 4e 54 45 52  CT, UNION, INTER
a8f0: 53 45 43 54 20 61 6e 64 20 45 58 43 45 50 54 20  SECT and EXCEPT 
a900: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
a910: 73 20 28 62 75 74 20 6e 6f 74 20 0a 2a 2a 20 55  s (but not .** U
a920: 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  NION ALL)..**.**
a930: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a940: 6e 65 64 20 69 73 20 74 68 65 20 61 64 64 72 65  ned is the addre
a950: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4f 70 65  ss of the OP_Ope
a960: 6e 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63  nVirtual instruc
a970: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
a980: 69 6e 74 20 6f 70 65 6e 56 69 72 74 75 61 6c 49  int openVirtualI
a990: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
a9a0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
a9b0: 6e 74 20 69 54 61 62 29 7b 0a 20 20 4b 65 79 49  nt iTab){.  KeyI
a9c0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
a9d0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20   int nColumn;.  
a9e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a9f0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
aa00: 69 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  i;.  Vdbe *v = p
aa10: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
aa20: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 69 66 28  int addr;..  if(
aa30: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
aa40: 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
aa50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
aa60: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70    nColumn = p->p
aa70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
aa80: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
aa90: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
aaa0: 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 75  *pKeyInfo)+nColu
aab0: 6d 6e 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  mn*sizeof(CollSe
aac0: 71 2a 29 20 29 3b 0a 20 20 69 66 28 20 70 4b 65  q*) );.  if( pKe
aad0: 79 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  yInfo==0 ) retur
aae0: 6e 20 30 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 2d  n 0;.  pKeyInfo-
aaf0: 3e 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b 0a  >enc = db->enc;.
ab00: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
ab10: 6c 64 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ld = nColumn;.  
ab20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
ab30: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4b  mn; i++){.    pK
ab40: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
ab50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
ab60: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
ab70: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
ab80: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70  xpr);.    if( !p
ab90: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
aba0: 5d 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49  ] ){.      pKeyI
abb0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
abc0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
abd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 64 64 72 20     }.  }.  addr 
abe0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33  = sqlite3VdbeOp3
abf0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75  (v, OP_OpenVirtu
ac00: 61 6c 2c 20 69 54 61 62 2c 20 30 2c 20 0a 20 20  al, iTab, 0, .  
ac10: 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
ac20: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
ac30: 48 41 4e 44 4f 46 46 29 3b 0a 20 20 72 65 74 75  HANDOFF);.  retu
ac40: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 6e  rn addr;.}..#ifn
ac50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ac60: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ac70: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 61 64  /*.** Add the ad
ac80: 64 72 65 73 73 20 22 61 64 64 72 22 20 74 6f 20  dress "addr" to 
ac90: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 4f  the set of all O
aca0: 70 65 6e 56 69 72 74 75 61 6c 20 6f 70 63 6f 64  penVirtual opcod
acb0: 65 20 61 64 64 72 65 73 73 65 73 0a 2a 2a 20 74  e addresses.** t
acc0: 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 61 63  hat are being ac
acd0: 63 75 6d 75 6c 61 74 65 64 20 69 6e 20 70 2d 3e  cumulated in p->
ace0: 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 2e 0a 2a  ppOpenVirtual..*
acf0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
ad00: 74 69 53 65 6c 65 63 74 4f 70 65 6e 56 69 72 74  tiSelectOpenVirt
ad10: 75 61 6c 41 64 64 72 28 53 65 6c 65 63 74 20 2a  ualAddr(Select *
ad20: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
ad30: 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  IdList *pList = 
ad40: 2a 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61  *p->ppOpenVirtua
ad50: 6c 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  l = sqlite3IdLis
ad60: 74 41 70 70 65 6e 64 28 2a 70 2d 3e 70 70 4f 70  tAppend(*p->ppOp
ad70: 65 6e 56 69 72 74 75 61 6c 2c 20 30 29 3b 0a 20  enVirtual, 0);. 
ad80: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
ad90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ada0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
adb0: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
adc0: 6e 49 64 2d 31 5d 2e 69 64 78 20 3d 20 61 64 64  nId-1].idx = add
add0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
ade0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
adf0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
ae00: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
ae10: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ae20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
ae30: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
ae40: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
ae50: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
ae60: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
ae70: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
ae80: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
ae90: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
aea0: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
aeb0: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
aec0: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
aed0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
aee0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
aef0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
af00: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
af10: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
af20: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
af30: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
af40: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
af50: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
af60: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
af70: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
af80: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
af90: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
afa0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
afb0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
afc0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
afd0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
afe0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
aff0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
b000: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
b010: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
b020: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
b030: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
b040: 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30   }.  if( pRet==0
b050: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
b060: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
b070: 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  q(pParse, p->pEL
b080: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
b090: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
b0a0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n pRet;.}.#endif
b0b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b0c0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
b0d0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
b0e0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b0f0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
b100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b110: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
b120: 61 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20  a query that is 
b130: 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e  really the union
b140: 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74  .** or intersect
b150: 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  ion of two or mo
b160: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
b170: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  ies..**.** "p" p
b180: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
b190: 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
b1a0: 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
b1b0: 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
b1c0: 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
b1d0: 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
b1e0: 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
b1f0: 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
b200: 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
b210: 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
b220: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
b230: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
b240: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
b250: 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
b260: 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
b270: 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
b280: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
b290: 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
b2a0: 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
b2b0: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
b2c0: 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
b2d0: 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
b2e0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
b2f0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
b300: 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
b310: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
b320: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
b330: 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
b340: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
b350: 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
b360: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
b370: 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
b380: 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
b390: 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
b3a0: 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
b3c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
b3d0: 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
b3e0: 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
b3f0: 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
b400: 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
b410: 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
b420: 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
b430: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
b440: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
b450: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
b460: 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
b470: 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
b480: 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
b490: 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
b4a0: 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
b4b0: 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
b4c0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
b4d0: 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
b4e0: 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
b4f0: 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
b500: 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
b510: 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
b520: 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
b530: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
b540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
b550: 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
b560: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b570: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b580: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
b590: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
b5a0: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
b5b0: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
b5c0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
b5d0: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
b5e0: 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53        /* \___  S
b5f0: 74 6f 72 65 20 71 75 65 72 79 20 72 65 73 75 6c  tore query resul
b600: 74 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20  ts as specified 
b610: 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20  */.  int iParm, 
b620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20             /* / 
b630: 20 20 20 20 62 79 20 74 68 65 73 65 20 74 77 6f      by these two
b640: 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20   parameters.    
b650: 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a       */.  char *
b660: 61 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20  aff             
b670: 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
b680: 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
b690: 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
b6a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
b6b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
b6c0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
b6d0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
b6e0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
b6f0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
b700: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
b710: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
b720: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b750: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
b760: 20 49 64 4c 69 73 74 20 2a 70 4f 70 65 6e 56 69   IdList *pOpenVi
b770: 72 74 75 61 6c 20 3d 20 30 3b 2f 2a 20 4f 50 5f  rtual = 0;/* OP_
b780: 4f 70 65 6e 56 69 72 74 75 61 6c 20 6f 70 63 6f  OpenVirtual opco
b790: 64 65 73 20 74 68 61 74 20 6e 65 65 64 20 61 20  des that need a 
b7a0: 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74  KeyInfo */.  int
b7b0: 20 61 41 64 64 72 5b 35 5d 3b 20 20 20 20 20 20   aAddr[5];      
b7c0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73 20     /* Addresses 
b7d0: 6f 66 20 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  of SetNumColumns
b7e0: 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
b7f0: 69 6e 74 20 6e 41 64 64 72 20 3d 20 30 3b 20 20  int nAddr = 0;  
b800: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b810: 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  used */.  int nC
b820: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
b830: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
b840: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
b850: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20  lt set */..  /* 
b860: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
b870: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
b880: 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  r LIMIT clause o
b890: 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e  n prior SELECTs.
b8a0: 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20    Only.  ** the 
b8b0: 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74  last (right-most
b8c0: 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20  ) SELECT in the 
b8d0: 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20  series may have 
b8e0: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  an ORDER BY or L
b8f0: 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  IMIT..  */.  if(
b900: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72 69   p==0 || p->pPri
b910: 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  or==0 ){.    rc 
b920: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
b930: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
b940: 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20 70    }.  pPrior = p
b950: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20  ->pPrior;.  if( 
b960: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
b970: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
b980: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
b990: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b9a0: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
b9b0: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
b9c0: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
b9d0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
b9e0: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
b9f0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ba00: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
ba10: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
ba20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
ba30: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
ba40: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
ba50: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
ba60: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
ba70: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
ba80: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
ba90: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
baa0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
bab0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
bac0: 72 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c  re we have a val
bad0: 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e  id query engine.
bae0: 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65    If not, create
baf0: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
bb00: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
bb10: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bb20: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
bb30: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
bb40: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
bb50: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  nd;.  }..  /* If
bb60: 20 2a 70 20 74 68 69 73 20 69 73 20 74 68 65 20   *p this is the 
bb70: 72 69 67 68 74 2d 6d 6f 73 74 20 73 65 6c 65 63  right-most selec
bb80: 74 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  t statement, the
bb90: 6e 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a  n initialize.  *
bba0: 2a 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75  * p->ppOpenVirtu
bbb0: 61 6c 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 70  al to point to p
bbc0: 4f 70 65 6e 56 69 72 74 75 61 6c 2e 20 20 49 66  OpenVirtual.  If
bbd0: 20 2a 70 20 69 73 20 6e 6f 74 20 74 68 65 20 72   *p is not the r
bbe0: 69 67 68 74 20 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight most.  ** s
bbf0: 74 61 74 65 6d 65 6e 74 20 74 68 65 6e 20 70 2d  tatement then p-
bc00: 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 77  >ppOpenVirtual w
bc10: 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
bc20: 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
bc30: 64 0a 20 20 2a 2a 20 62 79 20 61 20 70 72 69 6f  d.  ** by a prio
bc40: 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 73  r call to this s
bc50: 61 6d 65 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ame procedure.  
bc60: 50 61 73 73 20 61 6c 6f 6e 67 20 74 68 65 20 70  Pass along the p
bc70: 4f 70 65 6e 56 69 72 74 75 61 6c 0a 20 20 2a 2a  OpenVirtual.  **
bc80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 50 72 69   pointer to pPri
bc90: 6f 72 2c 20 74 68 65 20 6e 65 78 74 20 73 74 61  or, the next sta
bca0: 74 65 6d 65 6e 74 20 74 6f 20 6f 75 72 20 6c 65  tement to our le
bcb0: 66 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ft..  */.  if( p
bcc0: 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 3d  ->ppOpenVirtual=
bcd0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 70 4f  =0 ){.    p->ppO
bce0: 70 65 6e 56 69 72 74 75 61 6c 20 3d 20 26 70 4f  penVirtual = &pO
bcf0: 70 65 6e 56 69 72 74 75 61 6c 3b 0a 20 20 7d 0a  penVirtual;.  }.
bd00: 20 20 70 50 72 69 6f 72 2d 3e 70 70 4f 70 65 6e    pPrior->ppOpen
bd10: 56 69 72 74 75 61 6c 20 3d 20 70 2d 3e 70 70 4f  Virtual = p->ppO
bd20: 70 65 6e 56 69 72 74 75 61 6c 3b 0a 0a 20 20 2f  penVirtual;..  /
bd30: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
bd40: 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
bd50: 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
bd60: 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
bd70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70   eDest==SRT_Temp
bd80: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73 73  Table ){.    ass
bd90: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
bda0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
bdb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
bdc0: 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72 6d 2c  nVirtual, iParm,
bdd0: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
bde0: 20 6e 41 64 64 72 3d 3d 30 20 29 3b 0a 20 20 20   nAddr==0 );.   
bdf0: 20 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20   aAddr[nAddr++] 
be00: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
be10: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43  Op(v, OP_SetNumC
be20: 6f 6c 75 6d 6e 73 2c 20 69 50 61 72 6d 2c 20 30  olumns, iParm, 0
be30: 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 53  );.    eDest = S
be40: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
be50: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
be60: 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
be70: 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
be80: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
be90: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
bea0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
beb0: 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ALL: {.      if(
bec0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
bed0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
bee0: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
bef0: 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
bf00: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
bf10: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
bf20: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
bf30: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
bf40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
bf50: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
bf60: 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74  e, pPrior, eDest
bf70: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
bf80: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
bf90: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
bfa0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bfb0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
bfc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
bfd0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
bfe0: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
bff0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
c000: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
c010: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
c020: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  fset;.        p-
c030: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
c040: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
c050: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
c060: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c070: 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
c080: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
c090: 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20  , aff);.        
c0a0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
c0b0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  or;.        if( 
c0c0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
c0d0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c0e0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
c0f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
c110: 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
c120: 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
c130: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
c140: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
c150: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
c160: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
c170: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
c180: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
c190: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
c1a0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
c1b0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
c1c0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
c1d0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
c1e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
c1f0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
c200: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
c210: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
c220: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
c230: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
c240: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
c250: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
c260: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
c270: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
c280: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
c290: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
c2a0: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
c2b0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
c2c0: 64 65 72 42 79 3b 20 20 20 20 20 2f 2a 20 54 68  derBy;     /* Th
c2d0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
c2e0: 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  e for the right 
c2f0: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
c300: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
c310: 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70   priorOp = p->op
c320: 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54  ==TK_ALL ? SRT_T
c330: 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e  able : SRT_Union
c340: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
c350: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 2d  t==priorOp && p-
c360: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20  >pOrderBy==0 && 
c370: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70  !p->pLimit && !p
c380: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
c390: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
c3a0: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
c3b0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
c3c0: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
c3d0: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
c3e0: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
c3f0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
c400: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
c410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c420: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
c430: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
c440: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c450: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
c460: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
c470: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
c480: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c490: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
c4a0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
c4b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
c4c0: 65 72 42 79 20 0a 20 20 20 20 20 20 20 20 26 26  erBy .        &&
c4d0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
c4e0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
c4f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 75 6e   p->pOrderBy, un
c500: 69 6f 6e 54 61 62 2c 20 31 29 20 29 7b 0a 20 20  ionTab, 1) ){.  
c510: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
c520: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
c530: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c540: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c550: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c560: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c570: 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 75 6e  _OpenVirtual, un
c580: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
c590: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54      if( p->op!=T
c5a0: 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  K_ALL ){.       
c5b0: 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
c5c0: 65 63 74 4f 70 65 6e 56 69 72 74 75 61 6c 41 64  ectOpenVirtualAd
c5d0: 64 72 28 70 2c 20 61 64 64 72 29 3b 0a 20 20 20  dr(p, addr);.   
c5e0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
c5f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c600: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c610: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c620: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c630: 20 20 20 7d 0a 09 61 73 73 65 72 74 28 20 6e 41     }..assert( nA
c640: 64 64 72 3c 73 69 7a 65 6f 66 28 61 41 64 64 72  ddr<sizeof(aAddr
c650: 29 2f 73 69 7a 65 6f 66 28 61 41 64 64 72 5b 30  )/sizeof(aAddr[0
c660: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 41  ]) );.        aA
c670: 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d 20 73  ddr[nAddr++] = s
c680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c690: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
c6a0: 6d 6e 73 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  mns, unionTab, 0
c6b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
c6c0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
c6d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
c6e0: 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
c6f0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
c700: 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
c710: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
c720: 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
c730: 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  y );.      rc = 
c740: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c750: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 72  arse, pPrior, pr
c760: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  iorOp, unionTab,
c770: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
c780: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
c790: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
c7a0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
c7b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c7c0: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
c7d0: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c7e0: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
c7f0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
c800: 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73 65  ){.         case
c810: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70 20   TK_EXCEPT:  op 
c820: 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20 20  = SRT_Except;   
c830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
c840: 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20  case TK_UNION:  
c850: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
c860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c870: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
c880: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54 61       op = SRT_Ta
c890: 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  ble;    break;. 
c8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
c8b0: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
c8c0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
c8d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
c8e0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
c8f0: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
c900: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
c910: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
c920: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
c930: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
c940: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
c950: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
c960: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c970: 65 2c 20 70 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54  e, p, op, unionT
c980: 61 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66  ab, 0, 0, 0, aff
c990: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  );.      p->pPri
c9a0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
c9b0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
c9c0: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
c9d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
c9e0: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
c9f0: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
ca00: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
ca10: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
ca20: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
ca30: 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  imit = -1;.     
ca40: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31   p->iOffset = -1
ca50: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ca60: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ca70: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ca80: 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20  .      }...     
ca90: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
caa0: 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
cab0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
cac0: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
cad0: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
cae0: 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
caf0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20 20  need..      */  
cb00: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 65      .      if( e
cb10: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
cb20: 20 75 6e 69 6f 6e 54 61 62 21 3d 69 50 61 72 6d   unionTab!=iParm
cb30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
cb40: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
cb50: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
cb60: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cb70: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
cb80: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
cb90: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
cba0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
cbb0: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
cbc0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
cbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
cbe0: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
cbf0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cc00: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
cc10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
cc20: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
cc30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cc40: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
cc50: 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b  unionTab, iBreak
cc60: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
cc70: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
cc80: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
cc90: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
cca0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ccb0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
ccc0: 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65   rc = selectInne
ccd0: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
cce0: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
ccf0: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
cd00: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
cd30: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
cd40: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
cd70: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
cd80: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
cd90: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
cda0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
cdb0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
cdc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
cdd0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cde0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
cdf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
ce10: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
ce20: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
ce30: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ce40: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
ce50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ce60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ce70: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
ce80: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
ce90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cea0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
ceb0: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
cec0: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
ced0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
cee0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
cef0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
cf00: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
cf10: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
cf20: 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53  .      /* INTERS
cf30: 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74  ECT is different
cf40: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73   from the others
cf50: 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72   since it requir
cf60: 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20  es.      ** two 
cf70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
cf80: 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20  .  Hence it has 
cf90: 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42  its own case.  B
cfa0: 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79  egin.      ** by
cfb0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
cfc0: 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
cfd0: 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
cfe0: 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73      tab1 = pPars
cff0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
d000: 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e   tab2 = pParse->
d010: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
d020: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
d030: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
d040: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70  olumn(pParse,p,p
d050: 2d 3e 70 4f 72 64 65 72 42 79 2c 74 61 62 31 2c  ->pOrderBy,tab1,
d060: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
d070: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
d080: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d090: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d0a0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
d0b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d0c0: 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 74  P_OpenVirtual, t
d0d0: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ab1, 0);.      r
d0e0: 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  c = multiSelectO
d0f0: 70 65 6e 56 69 72 74 75 61 6c 41 64 64 72 28 70  penVirtualAddr(p
d100: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 69  , addr);.      i
d110: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d120: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d130: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d140: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
d150: 20 61 73 73 65 72 74 28 20 6e 41 64 64 72 3c 73   assert( nAddr<s
d160: 69 7a 65 6f 66 28 61 41 64 64 72 29 2f 73 69 7a  izeof(aAddr)/siz
d170: 65 6f 66 28 61 41 64 64 72 5b 30 5d 29 20 29 3b  eof(aAddr[0]) );
d180: 0a 20 20 20 20 20 20 61 41 64 64 72 5b 6e 41 64  .      aAddr[nAd
d190: 64 72 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56  dr++] = sqlite3V
d1a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
d1b0: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 74 61  etNumColumns, ta
d1c0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
d1d0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d1e0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
d1f0: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
d200: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
d210: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
d220: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
d230: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d240: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d250: 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e 69   pPrior, SRT_Uni
d260: 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c 20  on, tab1, 0, 0, 
d270: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  0, aff);.      i
d280: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d290: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d2a0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
d2b0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
d2c0: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
d2d0: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
d2e0: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
d2f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
d300: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d310: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 56  ddOp(v, OP_OpenV
d320: 69 72 74 75 61 6c 2c 20 74 61 62 32 2c 20 30 29  irtual, tab2, 0)
d330: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c  ;.      rc = mul
d340: 74 69 53 65 6c 65 63 74 4f 70 65 6e 56 69 72 74  tiSelectOpenVirt
d350: 75 61 6c 41 64 64 72 28 70 2c 20 61 64 64 72 29  ualAddr(p, addr)
d360: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d370: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d380: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
d390: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
d3a0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
d3b0: 28 20 6e 41 64 64 72 3c 73 69 7a 65 6f 66 28 61  ( nAddr<sizeof(a
d3c0: 41 64 64 72 29 2f 73 69 7a 65 6f 66 28 61 41 64  Addr)/sizeof(aAd
d3d0: 64 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20  dr[0]) );.      
d3e0: 61 41 64 64 72 5b 6e 41 64 64 72 2b 2b 5d 20 3d  aAddr[nAddr++] =
d3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d400: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
d410: 6c 75 6d 6e 73 2c 20 74 61 62 32 2c 20 30 29 3b  lumns, tab2, 0);
d420: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
d430: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
d440: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
d450: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d460: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
d470: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
d480: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
d490: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
d4a0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d4b0: 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55  pParse, p, SRT_U
d4c0: 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30  nion, tab2, 0, 0
d4d0: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d4e0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
d4f0: 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ior;.      sqlit
d500: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
d510: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d520: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
d530: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d540: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
d550: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d560: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d570: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d580: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d590: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d5a0: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
d5b0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
d5c0: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
d5d0: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
d5e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
d5f0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d600: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
d610: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
d620: 7b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61  {.        genera
d630: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
d640: 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70 45 4c 69  arse, 0, p->pELi
d650: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
d660: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
d670: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d680: 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
d690: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d6a0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
d6b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d6c0: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
d6d0: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
d6e0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
d6f0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
d700: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 53  se, p);.      iS
d710: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
d720: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
d730: 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a  wKey, tab1, 0);.
d740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d750: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
d760: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
d770: 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nt);.      rc = 
d780: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
d790: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
d7a0: 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70  List, tab1, p->p
d7b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4f             p->pO
d7e0: 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73  rderBy, -1, eDes
d7f0: 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20  t, iParm, .     
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69          iCont, i
d820: 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Break, 0);.     
d830: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d840: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
d850: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d860: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d870: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
d880: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d890: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
d8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d8b0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61  p(v, OP_Next, ta
d8c0: 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  b1, iStart);.   
d8d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
d8e0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
d8f0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
d900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d910: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
d920: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
d930: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d940: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
d950: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d960: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d970: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
d980: 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
d990: 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
d9a0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
d9b0: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
d9c0: 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
d9d0: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
d9e0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
d9f0: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
da00: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
da10: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
da20: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
da30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
da40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
da50: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
da60: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
da70: 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
da80: 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
da90: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
daa0: 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
dab0: 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
dac0: 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
dad0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
dae0: 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
daf0: 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
db00: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
db10: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
db20: 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70  .  */.  nCol = p
db30: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
db40: 0a 20 20 77 68 69 6c 65 28 20 6e 41 64 64 72 3e  .  while( nAddr>
db50: 30 20 29 7b 0a 20 20 20 20 6e 41 64 64 72 2d 2d  0 ){.    nAddr--
db60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
db70: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 41 64  eChangeP2(v, aAd
db80: 64 72 5b 6e 41 64 64 72 5d 2c 20 6e 43 6f 6c 29  dr[nAddr], nCol)
db90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
dba0: 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
dbb0: 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
dbc0: 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
dbd0: 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
dbe0: 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
dbf0: 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
dc00: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
dc10: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
dc20: 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
dc30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
dc40: 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
dc50: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
dc60: 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
dc70: 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
dc80: 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
dc90: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
dca0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
dcb0: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
dcc0: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
dcd0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
dce0: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
dcf0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
dd00: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
dd10: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
dd20: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
dd30: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
dd40: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
dd50: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
dd60: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
dd70: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
dd80: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
dd90: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
dda0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
ddb0: 65 72 42 79 20 7c 7c 20 28 70 4f 70 65 6e 56 69  erBy || (pOpenVi
ddc0: 72 74 75 61 6c 20 26 26 20 70 4f 70 65 6e 56 69  rtual && pOpenVi
ddd0: 72 74 75 61 6c 2d 3e 6e 49 64 3e 30 29 20 29 7b  rtual->nId>0) ){
dde0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
de10: 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
de20: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
de30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
de40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
de50: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
de60: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
de70: 20 70 2d 3e 70 70 4f 70 65 6e 56 69 72 74 75 61   p->ppOpenVirtua
de80: 6c 20 3d 3d 20 26 70 4f 70 65 6e 56 69 72 74 75  l == &pOpenVirtu
de90: 61 6c 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  al );.    pKeyIn
dea0: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  fo = sqliteMallo
deb0: 63 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  c(sizeof(*pKeyIn
dec0: 66 6f 29 2b 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  fo)+nCol*sizeof(
ded0: 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20  CollSeq*));.    
dee0: 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
def0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
df00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
df10: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
df20: 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
df30: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20    pKeyInfo->enc 
df40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
df50: 63 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  c;.    pKeyInfo-
df60: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
df70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
df80: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
df90: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
dfa0: 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
dfb0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
dfc0: 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
dfd0: 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  f( !pKeyInfo->aC
dfe0: 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
dff0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
e000: 6c 5b 69 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64  l[i] = pParse->d
e010: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
e020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e030: 20 66 6f 72 28 69 3d 30 3b 20 70 4f 70 65 6e 56   for(i=0; pOpenV
e040: 69 72 74 75 61 6c 20 26 26 20 69 3c 70 4f 70 65  irtual && i<pOpe
e050: 6e 56 69 72 74 75 61 6c 2d 3e 6e 49 64 3b 20 69  nVirtual->nId; i
e060: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
e070: 33 74 79 70 65 20 3d 20 28 69 3d 3d 30 3f 50 33  3type = (i==0?P3
e080: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
e090: 3a 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20  :P3_KEYINFO);.  
e0a0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
e0b0: 4f 70 65 6e 56 69 72 74 75 61 6c 2d 3e 61 5b 69  OpenVirtual->a[i
e0c0: 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 73 71 6c  ].idx;.      sql
e0d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e0e0: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 20  (v, addr, (char 
e0f0: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 33 74 79  *)pKeyInfo, p3ty
e100: 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  pe);.    }..    
e110: 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
e120: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
e130: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e140: 4f 72 64 65 72 42 79 54 65 72 6d 20 3d 20 70 2d  OrderByTerm = p-
e150: 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
e160: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
e170: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
e180: 72 3b 20 69 2b 2b 2c 20 70 4f 72 64 65 72 42 79  r; i++, pOrderBy
e190: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
e1a0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
e1b0: 4f 72 64 65 72 42 79 54 65 72 6d 2d 3e 70 45 78  OrderByTerm->pEx
e1c0: 70 72 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  pr;.        char
e1d0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 72 64 65 72   *zName = pOrder
e1e0: 42 79 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ByTerm->zName;. 
e1f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e200: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
e210: 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43  UMN && pExpr->iC
e220: 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20  olumn<nCol );.  
e230: 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
e240: 20 21 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29   !pExpr->pColl )
e250: 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ; */.        if(
e260: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
e270: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
e280: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
e290: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
e2a0: 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20  zName, -1);.    
e2b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e2c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
e2d0: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
e2e0: 6f 6c 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  oll[pExpr->iColu
e2f0: 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mn];.        }. 
e300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 65 6e       }.      gen
e310: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
e320: 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70  arse, p, v, p->p
e330: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44  EList->nExpr, eD
e340: 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  est, iParm);.   
e350: 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 4f 70   }..    if( !pOp
e360: 65 6e 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  enVirtual ){.   
e370: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
e380: 6e 73 20 66 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c  ns for UNION ALL
e390: 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 2a 2f   ... ORDER BY */
e3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
e3b0: 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  e(pKeyInfo);.   
e3c0: 20 7d 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65   }.  }..multi_se
e3d0: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 69 66 28 20  lect_end:.  if( 
e3e0: 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 29 7b 0a  pOpenVirtual ){.
e3f0: 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
e400: 74 44 65 6c 65 74 65 28 70 4f 70 65 6e 56 69 72  tDelete(pOpenVir
e410: 74 75 61 6c 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  tual);.  }.  p->
e420: 70 70 4f 70 65 6e 56 69 72 74 75 61 6c 20 3d 20  ppOpenVirtual = 
e430: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
e440: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e450: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e460: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
e470: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e480: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  VIEW./*.** Scan 
e490: 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
e4a0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
e4b0: 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
e4c0: 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
e4d0: 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
e4e0: 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
e4f0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
e500: 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
e510: 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
e520: 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
e530: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
e540: 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
e550: 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
e560: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
e570: 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
e580: 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
e590: 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
e5a0: 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
e5b0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
e5c0: 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
e5d0: 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
e5e0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
e5f0: 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
e600: 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
e610: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
e620: 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
e630: 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
e640: 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
e650: 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
e660: 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
e670: 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
e680: 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
e690: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
e6a0: 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
e6b0: 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
e6c0: 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
e6d0: 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
e6e0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
e6f0: 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
e700: 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45  (ExprList*,int,E
e710: 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46  xprList*);  /* F
e720: 6f 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73  orward Decl */.s
e730: 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
e740: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 2c  Select(Select *,
e750: 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
e760: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44  );  /* Forward D
e770: 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ecl */.static vo
e780: 69 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70  id substExpr(Exp
e790: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54  r *pExpr, int iT
e7a0: 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  able, ExprList *
e7b0: 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  pEList){.  if( p
e7c0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
e7d0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
e7e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
e7f0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
e800: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
e810: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
e820: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
e830: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
e840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e850: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
e860: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
e870: 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
e880: 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
e890: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
e8a0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
e8b0: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
e8c0: 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
e8d0: 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
e8e0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c        pNew = pEL
e8f0: 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
e900: 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
e910: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
e920: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  !=0 );.      pEx
e930: 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
e940: 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
e950: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
e960: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
e970: 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
e980: 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ExprDup(pNew->pL
e990: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  eft);.      asse
e9a0: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
e9b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
e9c0: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  xpr->pRight = sq
e9d0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65  lite3ExprDup(pNe
e9e0: 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  w->pRight);.    
e9f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ea00: 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
ea10: 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
ea20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
ea30: 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74  tDup(pNew->pList
ea40: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
ea50: 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69  iTable = pNew->i
ea60: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78  Table;.      pEx
ea70: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e  pr->iColumn = pN
ea80: 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ew->iColumn;.   
ea90: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
eaa0: 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
eab0: 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
eac0: 6f 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65  opy(&pExpr->toke
ead0: 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
eae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
eaf0: 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d  okenCopy(&pExpr-
eb00: 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70  >span, &pNew->sp
eb10: 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  an);.      pExpr
eb20: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
eb30: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 4e 65  te3SelectDup(pNe
eb40: 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  w->pSelect);.   
eb50: 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
eb60: 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20  = pNew->flags;. 
eb70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
eb80: 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
eb90: 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
eba0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
ebb0: 75 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e  ubstExpr(pExpr->
ebc0: 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
ebd0: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
ebe0: 73 74 53 65 6c 65 63 74 28 70 45 78 70 72 2d 3e  stSelect(pExpr->
ebf0: 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
ec00: 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
ec10: 62 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70  bstExprList(pExp
ec20: 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  r->pList, iTable
ec30: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
ec40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
ec50: 73 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  stExprList(ExprL
ec60: 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20  ist *pList, int 
ec70: 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
ec80: 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74   *pEList){.  int
ec90: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
eca0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
ecb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
ecc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
ecd0: 20 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73    substExpr(pLis
ece0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
ecf0: 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
ed00: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
ed10: 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
ed20: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54 61  lect *p, int iTa
ed30: 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
ed40: 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 21 70  EList){.  if( !p
ed50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62   ) return;.  sub
ed60: 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
ed70: 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
ed80: 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
ed90: 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70  prList(p->pGroup
eda0: 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
edb0: 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
edc0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
edd0: 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
ede0: 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70  );.  substExpr(p
edf0: 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
ee00: 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
ee10: 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72  bstExpr(p->pWher
ee20: 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
ee30: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
ee40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ee50: 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
ee60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee70: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
ee80: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
ee90: 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
eea0: 75 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64  ubqueries in ord
eeb0: 65 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65  er to speed.** e
eec0: 78 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65  xecution.  It re
eed0: 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
eee0: 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
eef0: 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
ef00: 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a  ng.** occurs..**
ef10: 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
ef20: 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
ef30: 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
ef40: 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
ef50: 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
ef60: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
ef70: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
ef80: 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
ef90: 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
efa0: 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
efb0: 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
efc0: 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
efd0: 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
efe0: 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
eff0: 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
f000: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
f010: 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
f020: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
f030: 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
f040: 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
f050: 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
f060: 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
f070: 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
f080: 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
f090: 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
f0a0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
f0b0: 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
f0c0: 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
f0d0: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
f0e0: 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
f0f0: 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
f100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f110: 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
f120: 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
f130: 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
f140: 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
f150: 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
f160: 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
f170: 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
f180: 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
f190: 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
f1a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
f1b0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
f1c0: 69 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e  is simpification
f1d0: 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
f1e0: 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
f1f0: 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
f200: 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
f210: 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
f220: 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
f230: 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
f240: 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
f250: 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
f260: 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
f270: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
f280: 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
f290: 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
f2a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f2b0: 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
f2c0: 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
f2d0: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
f2e0: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
f2f0: 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
f300: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
f310: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f320: 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
f330: 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  e or the outer q
f340: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
f350: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  in..**.**   (3) 
f360: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
f370: 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
f380: 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
f390: 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a   outer join, or.
f3a0: 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75  **        the su
f3b0: 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74  bquery is not it
f3c0: 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54  self a join.  (T
f3d0: 69 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a  icket #306).**.*
f3e0: 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
f3f0: 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
f400: 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
f410: 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
f420: 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
f430: 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
f440: 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
f450: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
f460: 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
f470: 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
f480: 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
f490: 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
f4a0: 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
f4b0: 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
f4c0: 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
f4d0: 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
f4e0: 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
f4f0: 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
f500: 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
f510: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
f520: 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
f530: 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
f540: 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
f550: 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
f560: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
f570: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
f580: 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
f590: 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
f5a0: 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
f5b0: 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
f5c0: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
f5d0: 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
f5e0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
f5f0: 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
f600: 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
f610: 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
f620: 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
f630: 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
f640: 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
f650: 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
f660: 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
f670: 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
f680: 20 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71    (12)  The subq
f690: 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
f6a0: 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
f6b0: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
f6c0: 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
f6d0: 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
f6e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
f6f0: 28 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74  (added by ticket
f700: 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 49 6e 20   #350).**.** In 
f710: 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
f720: 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
f730: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f740: 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
f750: 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
f760: 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
f770: 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
f780: 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
f790: 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
f7a0: 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
f7b0: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
f7c0: 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
f7d0: 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
f7e0: 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
f7f0: 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
f800: 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
f810: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
f820: 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
f830: 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
f840: 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
f850: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
f860: 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
f870: 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
f880: 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
f890: 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
f8a0: 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
f8b0: 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
f8c0: 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
f8d0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
f8e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
f8f0: 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
f900: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
f920: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f930: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
f940: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
f950: 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
f960: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
f970: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
f980: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f990: 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
f9a0: 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
f9b0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
f9c0: 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
f9d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
f9e0: 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
f9f0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
fa00: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
fa10: 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
fa20: 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
fa30: 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
fa40: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
fa50: 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  .){.  Select *pS
fa60: 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
fa70: 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
fa80: 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
fa90: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
faa0: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
fab0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
fac0: 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
fad0: 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
fae0: 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
faf0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
fb00: 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
fb10: 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
fb20: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
fb30: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
fb40: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
fb50: 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
fb60: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
fb70: 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
fb80: 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
fb90: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbb0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
fbc0: 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
fbf0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
fc00: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
fc10: 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
fc20: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
fc30: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
fc40: 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
fc50: 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
fc60: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
fc70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d  ..  */.  if( p==
fc80: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
fc90: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
fca0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
fcb0: 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
fcc0: 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
fcd0: 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
fce0: 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
fcf0: 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
fd00: 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
fd10: 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
fd20: 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
fd30: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
fd40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
fd50: 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
fd60: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
fd70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 75 62  return 0;.  pSub
fd80: 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
fd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
fda0: 53 72 63 20 29 3b 0a 20 20 69 66 28 20 28 70 53  Src );.  if( (pS
fdb0: 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
fdc0: 3e 70 4c 69 6d 69 74 29 20 7c 7c 20 70 53 75 62  >pLimit) || pSub
fdd0: 2d 3e 70 4f 66 66 73 65 74 20 7c 7c 20 0a 20 20  ->pOffset || .  
fde0: 20 20 20 20 28 70 53 75 62 2d 3e 70 4c 69 6d 69      (pSub->pLimi
fdf0: 74 20 26 26 20 69 73 41 67 67 29 20 29 20 72 65  t && isAgg) ) re
fe00: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53  turn 0;.  if( pS
fe10: 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29  ubSrc->nSrc==0 )
fe20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fe30: 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
fe40: 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
fe50: 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
fe60: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fe70: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69   }.  if( p->isDi
fe80: 73 74 69 6e 63 74 20 26 26 20 73 75 62 71 75 65  stinct && subque
fe90: 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
fea0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   0;.  if( p->pOr
feb0: 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
fec0: 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
fed0: 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69   0;..  /* Restri
fee0: 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
fef0: 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
ff00: 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
ff10: 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
ff20: 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
ff30: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
ff40: 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
ff50: 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
ff60: 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
ff70: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
ff80: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
ff90: 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
ffa0: 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
ffb0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
ffc0: 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
ffd0: 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
ffe0: 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
fff0: 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
10000 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
10010 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
10020 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
10030 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
10040 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
10050 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
10060 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
10070 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
10080 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
10090 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
100a0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
100b0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
100c0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
100d0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
100e0 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
100f0 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
10100 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
10110 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
10120 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
10130 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
10140 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
10150 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
10160 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
10170 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
10180 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
10190 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
101a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
101b0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
101c0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
101d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
101e0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
101f0 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
10200 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
10210 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
10220 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
10230 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
10240 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
10250 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
10260 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
10270 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
10280 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
10290 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20  /.  if( iFrom>0 
102a0 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
102b0 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
102c0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
102d0 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68      && pSub->pWh
102e0 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ere!=0 ){.    re
102f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
10300 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
10310 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
10320 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  ns flattening is
10330 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74   permitted for t
10340 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68  he.  ** iFrom-th
10350 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
10360 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
10370 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
10380 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c  */..  /* Move al
10390 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
103a0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
103b0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
103c0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
103d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
103e0 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
103f0 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
10400 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
10410 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
10420 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
10430 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
10440 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
10450 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
10460 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
10470 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
10480 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
10490 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
104a0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
104b0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
104c0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
104d0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
104e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
104f0 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
10500 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
10510 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
10520 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
10530 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
10540 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72   in..  */.  iPar
10550 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
10560 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20  iCursor;.  {.   
10570 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70   int nSubSrc = p
10580 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  SubSrc->nSrc;.  
10590 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
105a0 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
105b0 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
105c0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
105d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b  pSubitem->pTab);
105e0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
105f0 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
10600 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
10610 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  Free(pSubitem->z
10620 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
10630 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
10640 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
10650 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
10660 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
10670 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
10680 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
10690 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
106a0 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
106b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
106c0 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  (pSrc, 0, 0);.  
106d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
106e0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
106f0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
10700 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
10710 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
10720 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
10730 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
10740 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
10750 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10760 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
10770 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
10780 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
10790 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
107a0 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
107b0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
107c0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
107d0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
107e0 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31  [iFrom+nSubSrc-1
107f0 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
10800 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
10810 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
10820 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
10830 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
10840 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
10850 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
10860 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
10870 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
10880 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
10890 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
108a0 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
108b0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
108c0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
108d0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
108e0 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10900 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
10910 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
10920 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
10930 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
10940 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10950 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
10960 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
10970 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
10980 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
10990 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
109a0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
109b0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
109c0 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
109d0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
109e0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
109f0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
10a00 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
10a10 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
10a20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
10a30 70 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  p->pEList, iPare
10a40 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10a50 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e  );.  pList = p->
10a60 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
10a70 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
10a80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
10a90 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66  r *pExpr;.    if
10aa0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
10ab0 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72  ame==0 && (pExpr
10ac0 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
10ad0 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30  Expr)->span.z!=0
10ae0 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
10af0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
10b00 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78 70  liteStrNDup(pExp
10b10 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70 72  r->span.z, pExpr
10b20 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 7d  ->span.n);.    }
10b30 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
10b40 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70   ){.    substExp
10b50 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
10b60 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
10b70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  ->pEList);.    s
10b80 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48 61 76  ubstExpr(p->pHav
10b90 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
10ba0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
10bb0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72  .  if( pSub->pOr
10bc0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 61 73 73  derBy ){.    ass
10bd0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10be0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  ==0 );.    p->pO
10bf0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
10c00 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 53 75  OrderBy;.    pSu
10c10 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
10c20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
10c30 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10c40 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10c50 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
10c60 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
10c70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  );.  }.  if( pSu
10c80 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
10c90 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
10ca0 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e 70  3ExprDup(pSub->p
10cb0 57 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Where);.  }else{
10cc0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
10cd0 0a 20 20 7d 0a 20 20 69 66 28 20 73 75 62 71 75  .  }.  if( subqu
10ce0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
10cf0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 76 69  assert( p->pHavi
10d00 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  ng==0 );.    p->
10d10 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 57 68  pHaving = p->pWh
10d20 65 72 65 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  ere;.    p->pWhe
10d30 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
10d40 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
10d50 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
10d60 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
10d70 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
10d80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
10d90 2d 3e 70 48 61 76 69 6e 67 2c 20 73 71 6c 69 74  ->pHaving, sqlit
10da0 65 33 45 78 70 72 44 75 70 28 70 53 75 62 2d 3e  e3ExprDup(pSub->
10db0 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 61  pHaving));.    a
10dc0 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
10dd0 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  By==0 );.    p->
10de0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
10df0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 53  e3ExprListDup(pS
10e00 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  ub->pGroupBy);. 
10e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73   }else{.    subs
10e20 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  tExpr(p->pWhere,
10e30 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
10e40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
10e50 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
10e60 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65 72  ExprAnd(p->pWher
10e70 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 7d 0a  e, pWhere);.  }.
10e80 0a 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65  .  /* The flatte
10e90 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
10ea0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
10eb0 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
10ec0 0a 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72  .  ** outer quer
10ed0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
10ee0 20 20 2a 2f 0a 20 20 70 2d 3e 69 73 44 69 73 74    */.  p->isDist
10ef0 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
10f00 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 69 73  inct || pSub->is
10f10 44 69 73 74 69 6e 63 74 3b 0a 0a 20 20 2f 2a 0a  Distinct;..  /*.
10f20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
10f30 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
10f40 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
10f50 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
10f60 54 20 79 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  T y;.  */.  if( 
10f70 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
10f80 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
10f90 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
10fa0 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
10fb0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   0;.  }..  /* Fi
10fc0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
10fd0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
10fe0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
10ff0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
11000 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
11010 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
11020 70 53 75 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSub);.  return 
11030 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
11040 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
11050 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  */../*.** Analyz
11060 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
11070 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 69 6e  tement passed in
11080 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
11090 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
110a0 69 73 20 61 20 73 69 6d 70 6c 65 20 6d 69 6e 28  is a simple min(
110b0 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79  ) or max() query
110c0 2e 20 20 49 66 20 69 74 20 69 73 20 61 6e 64 20  .  If it is and 
110d0 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20 62  this query can b
110e0 65 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75  e.** satisfied u
110f0 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 65  sing a single se
11100 65 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ek to the beginn
11110 69 6e 67 20 6f 72 20 65 6e 64 20 6f 66 20 61 6e  ing or end of an
11120 20 69 6e 64 65 78 2c 0a 2a 2a 20 74 68 65 6e 20   index,.** then 
11130 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
11140 65 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  e for this SELEC
11150 54 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  T and return 1. 
11160 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
11170 61 20 0a 2a 2a 20 73 69 6d 70 6c 65 20 6d 69 6e  a .** simple min
11180 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
11190 79 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  y, then return 0
111a0 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6d 70 6c 79  ;.**.** A simply
111b0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
111c0 71 75 65 72 79 20 6c 6f 6f 6b 73 20 6c 69 6b 65  query looks like
111d0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
111e0 53 45 4c 45 43 54 20 6d 69 6e 28 61 29 20 46 52  SELECT min(a) FR
111f0 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 20 20 20 20  OM table;.**    
11200 53 45 4c 45 43 54 20 6d 61 78 28 61 29 20 46 52  SELECT max(a) FR
11210 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a 0a 2a 2a 20  OM table;.**.** 
11220 54 68 65 20 71 75 65 72 79 20 6d 61 79 20 68 61  The query may ha
11230 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ve only a single
11240 20 74 61 62 6c 65 20 69 6e 20 69 74 73 20 46 52   table in its FR
11250 4f 4d 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68  OM argument.  Th
11260 65 72 65 0a 2a 2a 20 63 61 6e 20 62 65 20 6e 6f  ere.** can be no
11270 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56   GROUP BY or HAV
11280 49 4e 47 20 6f 72 20 57 48 45 52 45 20 63 6c 61  ING or WHERE cla
11290 75 73 65 73 2e 20 20 54 68 65 20 72 65 73 75 6c  uses.  The resul
112a0 74 20 73 65 74 20 6d 75 73 74 0a 2a 2a 20 62 65  t set must.** be
112b0 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
112c0 78 28 29 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  x() of a single 
112d0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
112e0 62 6c 65 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ble.  The column
112f0 0a 2a 2a 20 69 6e 20 74 68 65 20 6d 69 6e 28 29  .** in the min()
11300 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
11310 6f 6e 20 6d 75 73 74 20 62 65 20 69 6e 64 65 78  on must be index
11320 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
11330 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 69 73  rameters to this
11340 20 72 6f 75 74 69 6e 65 20 61 72 65 20 74 68 65   routine are the
11350 20 73 61 6d 65 20 61 73 20 66 6f 72 20 73 71 6c   same as for sql
11360 69 74 65 33 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ite3Select()..**
11370 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
11380 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20  comment on that 
11390 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
113a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
113b0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
113c0 74 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75  t simpleMinMaxQu
113d0 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
113e0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
113f0 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
11400 72 6d 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  rm){.  Expr *pEx
11410 70 72 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a  pr;.  int iCol;.
11420 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
11430 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
11440 69 6e 74 20 62 61 73 65 3b 0a 20 20 56 64 62 65  int base;.  Vdbe
11450 20 2a 76 3b 0a 20 20 69 6e 74 20 73 65 65 6b 4f   *v;.  int seekO
11460 70 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 3b 0a 20  p;.  int cont;. 
11470 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11480 74 2c 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74  t, *pList, eList
11490 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
114a0 69 73 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74  ist_item eListIt
114b0 65 6d 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  em;.  SrcList *p
114c0 53 72 63 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  Src;..  /* Check
114d0 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20   to see if this 
114e0 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c  query is a simpl
114f0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
11500 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a   query.  Return.
11510 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20    ** zero if it 
11520 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20  is  not..  */.  
11530 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
11540 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c  || p->pHaving ||
11550 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
11560 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
11570 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
11580 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
11590 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73  eturn 0;.  pELis
115a0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
115b0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
115c0 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
115d0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
115e0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
115f0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
11600 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
11610 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
11620 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
11630 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
11640 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
11650 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
11660 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
11670 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74  token.n!=3 ) ret
11680 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
11690 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 45 78  ite3StrNICmp(pEx
116a0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e  pr->token.z,"min
116b0 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ",3)==0 ){.    s
116c0 65 65 6b 4f 70 20 3d 20 4f 50 5f 52 65 77 69 6e  eekOp = OP_Rewin
116d0 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  d;.  }else if( s
116e0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
116f0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d  Expr->token.z,"m
11700 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  ax",3)==0 ){.   
11710 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73   seekOp = OP_Las
11720 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
11730 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
11740 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
11750 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
11760 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
11770 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
11780 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  ;.  iCol = pExpr
11790 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61  ->iColumn;.  pTa
117a0 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  b = pSrc->a[0].p
117b0 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  Tab;..  /* If we
117c0 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
117d0 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
117e0 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
117f0 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
11800 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
11810 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
11820 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
11830 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
11840 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
11850 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
11860 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
11870 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
11880 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
11890 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
118a0 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
118b0 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
118c0 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
118d0 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
118e0 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
118f0 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
11900 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
11910 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
11920 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
11930 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
11940 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
11950 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
11960 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
11970 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
11980 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
11990 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
119a0 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
119b0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
119c0 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 70 49 64  [0]==iCol && pId
119d0 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c  x->keyInfo.aColl
119e0 5b 30 5d 3d 3d 70 43 6f 6c 6c 20 29 20 62 72 65  [0]==pColl ) bre
119f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
11a00 28 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75  ( pIdx==0 ) retu
11a10 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
11a20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20  Identify column 
11a30 74 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c  types if we will
11a40 20 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61   be using the ca
11a50 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
11a60 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
11a70 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
11a80 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74   is going to a t
11a90 61 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79  able or a memory
11aa0 20 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20   cell..  ** The 
11ab0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76  column names hav
11ac0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  e already been g
11ad0 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20  enerated in the 
11ae0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
11af0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
11b00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11b10 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
11b20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
11b30 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
11b40 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
11b50 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11b60 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
11b70 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
11b80 44 65 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61  Dest==SRT_TempTa
11b90 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
11ba0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11bb0 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69  P_OpenVirtual, i
11bc0 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71  Parm, 0);.    sq
11bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11be0 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
11bf0 6e 73 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ns, iParm, 1);. 
11c00 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
11c10 69 6e 67 20 63 6f 64 65 20 74 6f 20 66 69 6e 64  ing code to find
11c20 20 74 68 65 20 6d 69 6e 20 6f 72 20 74 68 65 20   the min or the 
11c30 6d 61 78 2e 20 20 42 61 73 69 63 61 6c 6c 79 20  max.  Basically 
11c40 61 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  all we have.  **
11c50 20 74 6f 20 64 6f 20 69 73 20 66 69 6e 64 20 74   to do is find t
11c60 68 65 20 66 69 72 73 74 20 6f 72 20 74 68 65 20  he first or the 
11c70 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
11c80 65 20 63 68 6f 73 65 6e 20 69 6e 64 65 78 2e 20  e chosen index. 
11c90 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 6d 69 6e   If.  ** the min
11ca0 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
11cb0 6e 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  n the INTEGER PR
11cc0 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
11cd0 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 0a 20  find the first. 
11ce0 20 2a 2a 20 6f 72 20 6c 61 73 74 20 65 6e 74 72   ** or last entr
11cf0 79 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  y in the main ta
11d00 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ble..  */.  sqli
11d10 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
11d20 65 6d 61 28 70 50 61 72 73 65 2c 20 70 54 61 62  ema(pParse, pTab
11d30 2d 3e 69 44 62 29 3b 0a 20 20 62 61 73 65 20 3d  ->iDb);.  base =
11d40 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
11d50 73 6f 72 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  sor;.  computeLi
11d60 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
11d70 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
11d80 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
11d90 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
11da0 74 65 33 4f 70 65 6e 54 61 62 6c 65 46 6f 72 52  te3OpenTableForR
11db0 65 61 64 69 6e 67 28 76 2c 20 62 61 73 65 2c 20  eading(v, base, 
11dc0 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 63 6f 6e  pTab);.  }.  con
11dd0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
11de0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
11df0 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
11e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11e10 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61  Op(v, seekOp, ba
11e20 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  se, 0);.  }else{
11e30 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  .    /* Even tho
11e40 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75  ugh the cursor u
11e50 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
11e60 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c  index here is cl
11e70 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73  osed.    ** as s
11e80 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20  oon as a single 
11e90 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72  value has been r
11ea0 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c  ead from it, all
11eb0 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  ocate it.    ** 
11ec0 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e  using (pParse->n
11ed0 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e  Tab++) to preven
11ee0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20  t the cursor id 
11ef0 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20  from being .    
11f00 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20  ** reused. This 
11f10 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  is important for
11f20 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
11f30 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20  he form .    ** 
11f40 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53  "INSERT INTO x S
11f50 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d  ELECT max() FROM
11f60 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   x"..    */.    
11f70 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 69 49  int iIdx;.    iI
11f80 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
11f90 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
11fa0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11fb0 49 6e 74 65 67 65 72 2c 20 70 49 64 78 2d 3e 69  Integer, pIdx->i
11fc0 44 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  Db, 0);.    sqli
11fd0 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
11fe0 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c  _OpenRead, iIdx,
11ff0 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20   pIdx->tnum,.   
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 28 63 68 61 72 2a 29 26 70 49 64 78 2d 3e 6b 65  (char*)&pIdx->ke
12020 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46  yInfo, P3_KEYINF
12030 4f 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6b  O);.    if( seek
12040 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 7b  Op==OP_Rewind ){
12050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12060 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
12070 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 0, 0);.     
12080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12090 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
120a0 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  rd, 1, 0);.     
120b0 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f 76   seekOp = OP_Mov
120c0 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eGt;.    }.    s
120d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
120e0 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78 2c  v, seekOp, iIdx,
120f0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12100 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12110 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c 20  IdxRowid, iIdx, 
12120 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
12130 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
12140 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b 0a  lose, iIdx, 0);.
12150 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12160 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
12170 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d  e, base, 0);.  }
12180 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20 3d  .  eList.nExpr =
12190 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65 4c   1;.  memset(&eL
121a0 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  istItem, 0, size
121b0 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b 0a  of(eListItem));.
121c0 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c 69    eList.a = &eLi
121d0 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74 2e  stItem;.  eList.
121e0 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
121f0 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  pr;.  selectInne
12200 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
12210 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30   &eList, 0, 0, 0
12220 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
12230 72 6d 2c 20 63 6f 6e 74 2c 20 63 6f 6e 74 2c 20  rm, cont, cont, 
12240 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
12250 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12260 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65   cont);.  sqlite
12270 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12280 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29  _Close, base, 0)
12290 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b  ;.  .  return 1;
122a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
122b0 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
122c0 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
122d0 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  e in a SELECT st
122e0 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
122f0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
12300 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a  f errors seen..*
12310 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  *.** An ORDER BY
12320 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20   or GROUP BY is 
12330 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
12340 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65  sions.  If any e
12350 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
12360 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
12370 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65  ant, then that e
12380 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
12390 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  laced by the.** 
123a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
123b0 74 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c  try in the resul
123c0 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
123d0 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
123e0 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65  rGroupBy(.  Name
123f0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
12400 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
12410 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
12420 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
12430 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
12440 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
12450 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
12460 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
12470 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
12480 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
12490 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f      /* Either "O
124a0 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
124b0 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
124c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
124d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
124e0 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
124f0 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
12500 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
12510 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65  ELECT */.  Parse
12520 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
12530 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54  pParse;     /* T
12540 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
12550 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20   the SELECT */. 
12560 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20   assert( pEList 
12570 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
12580 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
12590 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
125a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
125b0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
125c0 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  ol;.    Expr *pE
125d0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
125e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
125f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
12600 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
12610 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
12620 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
12630 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
12640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12650 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20  prDelete(pE);.  
12660 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
12670 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
12680 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
12690 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
126a0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
126b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
126c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
126d0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
126e0 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d      "%s BY colum
126f0 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
12700 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
12710 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
12720 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
12730 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f   %d", zType, iCo
12740 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
12750 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
12760 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
12770 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
12780 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
12790 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
127a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
127b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
127c0 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
127d0 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
127e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
127f0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12800 20 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d    "%s BY terms m
12810 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69  ust not be non-i
12820 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73  nteger constants
12830 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  ", zType);.     
12840 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
12850 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
12870 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20  outine resolves 
12880 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69  any names used i
12890 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
128a0 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c   of the.** suppl
128b0 69 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  ied SELECT state
128c0 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c  ment. If the SEL
128d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
128e0 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20  ing resolved.** 
128f0 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
12900 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69   then pOuterNC i
12910 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12920 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a  he NameContext .
12930 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
12940 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20   SELECT..*/.int 
12950 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
12960 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70  olve(.  Parse *p
12970 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
12980 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
12990 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
129a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
129b0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
129c0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
129d0 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
129e0 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
129f0 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e    /* The outer n
12a00 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79  ame context. May
12a10 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a   be NULL. */.){.
12a20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
12a30 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
12a40 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20  Result set. */. 
12a50 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
12a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12a70 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65  or-loop variable
12a80 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c   used in multipl
12a90 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61  e places */.  Na
12aa0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
12ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
12ac0 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a  l name-context *
12ad0 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
12ae0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
12af0 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
12b00 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
12b10 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
12b20 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
12b30 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
12b40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12b50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
12b60 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
12b70 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
12b80 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
12b90 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
12ba0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
12bb0 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
12bc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12bd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
12be0 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
12bf0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
12c00 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
12c10 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
12c20 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
12c30 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
12c40 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
12c50 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
12c60 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
12c70 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
12c80 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
12c90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12ca0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
12cb0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
12cc0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
12cd0 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
12ce0 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
12cf0 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
12d00 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
12d10 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
12d20 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
12d30 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
12d40 2f 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  /.  sNC.pParse =
12d50 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 68   pParse;.  sNC.h
12d60 61 73 41 67 67 20 3d 20 30 3b 0a 20 20 73 4e 43  asAgg = 0;.  sNC
12d70 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 4e 43  .nErr = 0;.  sNC
12d80 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 73 4e 43  .nRef = 0;.  sNC
12d90 2e 70 45 4c 69 73 74 20 3d 20 30 3b 0a 20 20 73  .pEList = 0;.  s
12da0 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b  NC.allowAgg = 0;
12db0 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
12dc0 3d 20 30 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  = 0;.  sNC.pNext
12dd0 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
12de0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
12df0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69  mes(&sNC, p->pLi
12e00 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  mit) ||.      sq
12e10 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
12e20 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
12e30 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72  Offset) ){.    r
12e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12e50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  OR;.  }..  /* Se
12e60 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e  t up the local n
12e70 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70  ame-context to p
12e80 61 73 73 20 74 6f 20 45 78 70 72 52 65 73 6f 6c  ass to ExprResol
12e90 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a  veNames() to.  *
12ea0 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * resolve the ex
12eb0 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20  pression-list.. 
12ec0 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41   */.  sNC.allowA
12ed0 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53  gg = 1;.  sNC.pS
12ee0 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  rcList = p->pSrc
12ef0 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20  ;.  sNC.pNext = 
12f00 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20  pOuterNC;..  /* 
12f10 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 6e 44 65 70  NameContext.nDep
12f20 74 68 20 73 74 6f 72 65 73 20 74 68 65 20 64 65  th stores the de
12f30 70 74 68 20 6f 66 20 72 65 63 75 72 73 69 6f 6e  pth of recursion
12f40 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
12f50 20 46 6f 72 0a 20 20 2a 2a 20 61 6e 20 6f 75 74   For.  ** an out
12f60 65 72 20 71 75 65 72 79 20 28 65 2e 67 2e 20 53  er query (e.g. S
12f70 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
12f80 69 74 65 5f 6d 61 73 74 65 72 29 20 74 68 69 73  ite_master) this
12f90 20 69 73 20 31 2e 20 46 6f 72 0a 20 20 2a 2a 20   is 1. For.  ** 
12fa0 61 20 73 75 62 71 75 65 72 79 20 69 74 20 69 73  a subquery it is
12fb0 20 32 2e 20 46 6f 72 20 61 20 73 75 62 71 75 65   2. For a subque
12fc0 72 79 20 6f 66 20 61 20 73 75 62 71 75 65 72 79  ry of a subquery
12fd0 2c 20 33 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20  , 3. And so on. 
12fe0 0a 20 20 2a 2a 20 50 61 72 73 65 2e 6e 4d 61 78  .  ** Parse.nMax
12ff0 44 65 70 74 68 20 69 73 20 74 68 65 20 6d 61 78  Depth is the max
13000 69 6d 75 6d 20 64 65 70 74 68 20 66 6f 72 20 61  imum depth for a
13010 6e 79 20 73 75 62 71 75 65 72 79 20 72 65 73 6f  ny subquery reso
13020 6c 76 65 64 20 73 6f 0a 20 20 2a 2a 20 66 61 72  lved so.  ** far
13030 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
13040 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
13050 6e 75 6d 62 65 72 20 6f 66 20 61 67 67 72 65 67  number of aggreg
13060 61 74 65 20 63 6f 6e 74 65 78 74 73 0a 20 20 2a  ate contexts.  *
13070 2a 20 72 65 71 75 69 72 65 64 20 61 74 20 72 75  * required at ru
13080 6e 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 73 4e  ntime..  */.  sN
13090 43 2e 6e 44 65 70 74 68 20 3d 20 28 70 4f 75 74  C.nDepth = (pOut
130a0 65 72 4e 43 3f 70 4f 75 74 65 72 4e 43 2d 3e 6e  erNC?pOuterNC->n
130b0 44 65 70 74 68 2b 31 3a 31 29 3b 0a 20 20 69 66  Depth+1:1);.  if
130c0 28 20 73 4e 43 2e 6e 44 65 70 74 68 3e 70 50 61  ( sNC.nDepth>pPa
130d0 72 73 65 2d 3e 6e 4d 61 78 44 65 70 74 68 20 29  rse->nMaxDepth )
130e0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  {.    pParse->nM
130f0 61 78 44 65 70 74 68 20 3d 20 73 4e 43 2e 6e 44  axDepth = sNC.nD
13100 65 70 74 68 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  epth;.  }..  /* 
13110 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
13120 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
13130 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
13140 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
13150 21 70 45 4c 69 73 74 20 29 20 72 65 74 75 72 6e  !pEList ) return
13160 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
13180 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
13190 0a 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20  .    Expr *pX = 
131a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
131b0 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  pr;.    if( sqli
131c0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
131d0 6d 65 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b  mes(&sNC, pX) ){
131e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
131f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
13200 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
13210 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72  here are no aggr
13220 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
13230 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
13240 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  t, and no GROUP 
13250 42 59 20 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  BY .  ** express
13260 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ion, do not allo
13270 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20  w aggregates in 
13280 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
13290 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
132a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  */.  assert( !p-
132b0 3e 69 73 41 67 67 20 29 3b 0a 20 20 69 66 28 20  >isAgg );.  if( 
132c0 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c 20 73  p->pGroupBy || s
132d0 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20  NC.hasAgg ){.   
132e0 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a 20   p->isAgg = 1;. 
132f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43 2e   }else{.    sNC.
13300 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20  allowAgg = 0;.  
13310 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41 56  }..  /* If a HAV
13320 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72  ING clause is pr
13330 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72  esent, then ther
13340 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55  e must be a GROU
13350 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a  P BY clause..  *
13360 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  /.  if( p->pHavi
13370 6e 67 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70  ng && !p->pGroup
13380 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
13390 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
133a0 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
133b0 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
133c0 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
133d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
133e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
133f0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70    /* Add the exp
13400 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
13410 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
13420 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
13430 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65  the.  ** other e
13440 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
13450 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
13460 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
13470 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  hat.  ** express
13480 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
13490 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
134a0 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
134b0 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a  ressions by.  **
134c0 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
134d0 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a  result set..  **
134e0 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e  .  ** Minor poin
134f0 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
13500 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
13510 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
13520 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c   be.  ** re-eval
13530 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72  uated for each r
13540 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a  eference to it..
13550 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73    */.  sNC.pELis
13560 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
13570 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
13580 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
13590 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c  C, p->pWhere) ||
135a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
135b0 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26  prResolveNames(&
135c0 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
135d0 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
135e0 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
135f0 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  NC, p->pOrderBy,
13600 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20   "ORDER") ||.   
13610 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47     processOrderG
13620 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e  roupBy(&sNC, p->
13630 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50  pGroupBy, "GROUP
13640 22 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ").  ){.    retu
13650 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
13660 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
13670 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13680 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
13690 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
136a0 73 74 72 75 63 74 20 69 73 20 75 73 65 64 20 62  struct is used b
136b0 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
136c0 29 0a 2a 2a 20 74 6f 20 73 61 76 65 20 61 67 67  ).** to save agg
136d0 72 65 67 61 74 65 20 72 65 6c 61 74 65 64 20 69  regate related i
136e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
136f0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
13700 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
13710 20 6f 66 20 65 61 63 68 20 63 61 6c 6c 20 61 6e   of each call an
13720 64 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 20  d to restore it 
13730 61 74 20 74 68 65 20 65 6e 64 2e 20 53 65 65 0a  at the end. See.
13740 2a 2a 20 73 61 76 65 41 67 67 72 65 67 61 74 65  ** saveAggregate
13750 49 6e 66 6f 28 29 20 61 6e 64 20 72 65 73 74 6f  Info() and resto
13760 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  reAggregateInfo(
13770 29 2e 0a 2a 2f 20 0a 73 74 72 75 63 74 20 41 67  )..*/ .struct Ag
13780 67 72 65 67 61 74 65 49 6e 66 6f 20 7b 0a 20 20  gregateInfo {.  
13790 69 6e 74 20 6e 41 67 67 3b 0a 20 20 41 67 67 45  int nAgg;.  AggE
137a0 78 70 72 20 2a 61 41 67 67 3b 0a 7d 3b 0a 74 79  xpr *aAgg;.};.ty
137b0 70 65 64 65 66 20 73 74 72 75 63 74 20 41 67 67  pedef struct Agg
137c0 72 65 67 61 74 65 49 6e 66 6f 20 41 67 67 72 65  regateInfo Aggre
137d0 67 61 74 65 49 6e 66 6f 3b 0a 0a 2f 2a 20 0a 2a  gateInfo;../* .*
137e0 2a 20 43 6f 70 79 20 61 67 67 72 65 67 61 74 65  * Copy aggregate
137f0 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61   related informa
13800 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 50 61  tion from the Pa
13810 72 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  rse structure.**
13820 20 69 6e 74 6f 20 74 68 65 20 41 67 67 72 65 67   into the Aggreg
13830 61 74 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ateInfo structur
13840 65 2e 20 5a 65 72 6f 20 74 68 65 20 61 67 67 72  e. Zero the aggr
13850 65 67 61 74 65 20 72 65 6c 61 74 65 64 0a 2a 2a  egate related.**
13860 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 50   values in the P
13870 61 72 73 65 20 73 74 72 75 63 74 2e 0a 2a 2f 0a  arse struct..*/.
13880 73 74 61 74 69 63 20 76 6f 69 64 20 73 61 76 65  static void save
13890 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 50 61  AggregateInfo(Pa
138a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
138b0 72 65 67 61 74 65 49 6e 66 6f 20 2a 70 49 6e 66  regateInfo *pInf
138c0 6f 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 61 41 67  o){.  pInfo->aAg
138d0 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
138e0 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 20  ;.  pInfo->nAgg 
138f0 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 0a  = pParse->nAgg;.
13900 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
13910 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41   0;.  pParse->nA
13920 67 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gg = 0;.}../*.**
13930 20 43 6f 70 79 20 61 67 67 72 65 67 61 74 65 20   Copy aggregate 
13940 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74  related informat
13950 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41 67 67  ion from the Agg
13960 72 65 67 61 74 65 49 6e 66 6f 20 73 74 72 75 63  regateInfo struc
13970 74 0a 2a 2a 20 62 61 63 6b 20 69 6e 74 6f 20 74  t.** back into t
13980 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
13990 72 65 2e 20 54 68 65 20 61 67 67 72 65 67 61 74  re. The aggregat
139a0 65 20 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d  e related inform
139b0 61 74 69 6f 6e 0a 2a 2a 20 63 75 72 72 65 6e 74  ation.** current
139c0 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
139d0 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
139e0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   is deleted..*/.
139f0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 74  static void rest
13a00 6f 72 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f  oreAggregateInfo
13a10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13a20 41 67 67 72 65 67 61 74 65 49 6e 66 6f 20 2a 70  AggregateInfo *p
13a30 49 6e 66 6f 29 7b 0a 20 20 73 71 6c 69 74 65 46  Info){.  sqliteF
13a40 72 65 65 28 70 50 61 72 73 65 2d 3e 61 41 67 67  ree(pParse->aAgg
13a50 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 41 67  );.  pParse->aAg
13a60 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 41 67 67 3b  g = pInfo->aAgg;
13a70 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  .  pParse->nAgg 
13a80 3d 20 70 49 6e 66 6f 2d 3e 6e 41 67 67 3b 0a 7d  = pInfo->nAgg;.}
13a90 0a 20 20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .  ./*.** Genera
13aa0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
13ab0 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74 61  given SELECT sta
13ac0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
13ad0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
13ae0 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
13af0 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
13b00 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 76 61  ing on the.** va
13b10 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61 6e 64  lue of eDest and
13b20 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20   iParm..**.**   
13b30 20 20 65 44 65 73 74 20 56 61 6c 75 65 20 20 20    eDest Value   
13b40 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
13b50 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
13b60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
13b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
13b90 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62 61 63       SRT_Callbac
13ba0 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  k    Invoke the 
13bb0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65 61 63  callback for eac
13bc0 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  h row of the res
13bd0 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ult..**.**     S
13be0 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 53  RT_Mem         S
13bf0 74 6f 72 65 20 66 69 72 73 74 20 72 65 73 75 6c  tore first resul
13c00 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t in memory cell
13c10 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
13c20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
13c30 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
13c40 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c 65 20  s keys of table 
13c50 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
13c60 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20   SRT_Union      
13c70 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61   Store results a
13c80 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d  s a key in a tem
13c90 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
13ca0 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  rm.**.**     SRT
13cb0 5f 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d  _Except      Rem
13cc0 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  ove results from
13cd0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
13ce0 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  able iParm..**.*
13cf0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
13d00 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
13d10 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
13d20 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a 0a   table iParm.**.
13d30 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 62 6f  ** The table abo
13d40 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65 74 65  ve is incomplete
13d50 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 44  .  Additional eD
13d60 69 73 74 20 76 61 6c 75 65 20 68 61 76 65 20 62  ist value have b
13d70 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e 63 65  e added.** since
13d80 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 77 61   this comment wa
13d90 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65 65 20  s written.  See 
13da0 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  the selectInnerL
13db0 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  oop() function f
13dc0 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65 74 65  or.** a complete
13dd0 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
13de0 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f  allowed values o
13df0 66 20 65 44 65 73 74 20 61 6e 64 20 74 68 65 69  f eDest and thei
13e00 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a  r meanings..**.*
13e10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
13e20 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
13e30 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
13e40 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
13e50 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
13e60 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
13e70 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
13e80 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
13e90 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
13ea0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13eb0 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
13ec0 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
13ed0 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
13ee0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
13ef0 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
13f00 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a   to do that..**.
13f10 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74 2c 20  ** The pParent, 
13f20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64 20 2a  parentTab, and *
13f30 70 50 61 72 65 6e 74 41 67 67 20 66 69 65 6c 64  pParentAgg field
13f40 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69 6e 20  s are filled in 
13f50 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c 45 43  if this.** SELEC
13f60 54 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2e  T is a subquery.
13f70 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
13f80 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62 69 6e  ay try to combin
13f90 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a 2a 2a  e this SELECT.**
13fa0 20 77 69 74 68 20 69 74 73 20 70 61 72 65 6e 74   with its parent
13fb0 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e 67 6c   to form a singl
13fc0 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20 20 49  e flat query.  I
13fd0 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74 20 6d  n so doing, it m
13fe0 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65 20 74  ight.** change t
13ff0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
14000 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67 72 65  from a non-aggre
14010 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67 72 65  gate to an aggre
14020 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 46  gate query..** F
14030 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  or that reason, 
14040 74 68 65 20 70 50 61 72 65 6e 74 41 67 67 20 66  the pParentAgg f
14050 6c 61 67 20 69 73 20 70 61 73 73 65 64 20 61 73  lag is passed as
14060 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 69   a pointer, so i
14070 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e  t.** can be chan
14080 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  ged..**.** Examp
14090 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65 61 6e  le 1:   The mean
140a0 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61 72 65  ing of the pPare
140b0 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  nt parameter..**
140c0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
140d0 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28 53 45  FROM t1 JOIN (SE
140e0 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28 2a 29  LECT x, count(*)
140f0 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e 20 74   FROM t2) JOIN t
14100 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20 20 20  3;.**    \      
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14120 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  \_______ subquer
14130 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  y _______/      
14140 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20 20 20    /.**     \    
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f    /.**      \___
14190 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
141a0 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
141b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
141c0 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  _/.**.** This ro
141d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
141e0 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75  for the outer qu
141f0 65 72 79 20 66 69 72 73 74 2e 20 20 20 46 6f 72  ery first.   For
14200 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70   that call,.** p
14210 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65 20 4e  Parent will be N
14220 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74 68 65  ULL.  During the
14230 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
14240 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2c 20  he outer query, 
14250 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  this .** routine
14260 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75 72   is called recur
14270 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64 6c 65  sively to handle
14280 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
14290 46 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  For the recursiv
142a0 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61 72 65  e.** call, pPare
142b0 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20 74 6f  nt will point to
142c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
142d0 2e 20 20 42 65 63 61 75 73 65 20 74 68 65 20 73  .  Because the s
142e0 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20 74 68  ubquery is.** th
142f0 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
14300 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61 79 20   in a three-way 
14310 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65 6e 74  join, the parent
14320 54 61 62 20 70 61 72 61 6d 65 74 65 72 20 77 69  Tab parameter wi
14330 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68 65 20  ll.** be 1 (the 
14340 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61 20 30  2nd value of a 0
14350 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79 2e 29  -indexed array.)
14360 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
14370 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
14380 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
14390 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
143a0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
143b0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
143c0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
143d0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
143e0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20  coded. */.  int 
143f0 65 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20  eDest,          
14400 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73     /* How to dis
14410 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75  pose of the resu
14420 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
14430 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
14440 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72 20 75  /* A parameter u
14450 73 65 64 20 62 79 20 74 68 65 20 65 44 65 73 74  sed by the eDest
14460 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
14470 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
14480 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20  arent,       /* 
14490 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 66  Another SELECT f
144a0 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 69 73  or which this is
144b0 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a   a sub-query */.
144c0 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61 62 2c    int parentTab,
144d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
144e0 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 70 53  x in pParent->pS
144f0 72 63 20 6f 66 20 74 68 69 73 20 71 75 65 72 79  rc of this query
14500 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61 72 65   */.  int *pPare
14510 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f 2a 20  ntAgg,       /* 
14520 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
14530 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
14540 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  unctions */.  ch
14550 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
14560 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65 73 74       /* If eDest
14570 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74   is SRT_Union, t
14580 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  he affinity stri
14590 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ng */.){.  int i
145a0 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ;.  WhereInfo *p
145b0 57 49 6e 66 6f 3b 0a 20 20 56 64 62 65 20 2a 76  WInfo;.  Vdbe *v
145c0 3b 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  ;.  int isAgg;  
145d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
145e0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
145f0 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
14600 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
14610 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
14620 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
14630 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
14640 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
14650 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
14660 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
14670 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
14680 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
14690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
146a0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
146b0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
146c0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
146d0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
146e0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
146f0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
14700 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
14710 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
14720 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
14730 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
14740 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
14750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
14760 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
14770 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
14780 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
14790 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
147a0 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
147b0 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
147c0 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
147d0 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
147e0 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
147f0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
14800 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
14810 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
14820 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
14830 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
14840 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 72 65 67  tion */.  Aggreg
14850 61 74 65 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  ateInfo sAggInfo
14860 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
14870 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 7c  _malloc_failed |
14880 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
14890 7c 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  | p==0 ) return 
148a0 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
148b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
148c0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
148d0 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
148e0 72 6e 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53  rn 1;..#ifndef S
148f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
14900 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
14910 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
14920 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
14930 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
14940 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
14950 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14960 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
14970 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
14980 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
14990 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a  t, iParm, aff);.
149a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 61    }.#endif..  sa
149b0 76 65 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28  veAggregateInfo(
149c0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
149d0 6f 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  o);.  pOrderBy =
149e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
149f0 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 55  if( eDest==SRT_U
14a00 6e 69 6f 6e 20 7c 7c 20 65 44 65 73 74 3d 3d 53  nion || eDest==S
14a10 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 65 44 65  RT_Except || eDe
14a20 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
14a30 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  ){.    p->pOrder
14a40 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  By = 0;.  }.  if
14a50 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  ( sqlite3SelectR
14a60 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
14a70 2c 20 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  , 0) ){.    goto
14a80 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
14a90 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
14aa0 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   pOrderBy;..  /*
14ab0 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69   Make local copi
14ac0 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  es of the parame
14ad0 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75  ters for this qu
14ae0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62  ery..  */.  pTab
14af0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
14b00 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
14b10 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
14b20 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
14b30 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
14b40 48 61 76 69 6e 67 3b 0a 20 20 69 73 41 67 67 20  Having;.  isAgg 
14b50 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73  = p->isAgg;.  is
14b60 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
14b70 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69  Distinct;.  pELi
14b80 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
14b90 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
14ba0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
14bb0 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
14bc0 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
14bd0 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
14be0 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
14bf0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
14c00 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
14c10 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
14c20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
14c30 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
14c40 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
14c50 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
14c60 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
14c70 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
14c80 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
14c90 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
14ca0 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
14cb0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 44 65 73  /.  assert( eDes
14cc0 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t!=SRT_Exists ||
14cd0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
14ce0 31 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  1 );.#ifndef SQL
14cf0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14d00 59 0a 20 20 69 66 28 20 28 65 44 65 73 74 3d 3d  Y.  if( (eDest==
14d10 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
14d20 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20 70 45  ==SRT_Set) && pE
14d30 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 7b  List->nExpr>1 ){
14d40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14d50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e  rMsg(pParse, "on
14d60 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  ly a single resu
14d70 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22  lt allowed for "
14d80 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43  .       "a SELEC
14d90 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  T that is part o
14da0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  f an expression"
14db0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  );.    goto sele
14dc0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
14dd0 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42  if..  /* ORDER B
14de0 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  Y is ignored for
14df0 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f   some destinatio
14e00 6e 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ns..  */.  switc
14e10 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
14e20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 0a  case SRT_Union:.
14e30 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
14e40 65 70 74 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ept:.    case SR
14e50 54 5f 44 69 73 63 61 72 64 3a 0a 20 20 20 20 20  T_Discard:.     
14e60 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
14e70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14e80 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 62  default:.      b
14e90 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
14ea0 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
14eb0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
14ec0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
14ed0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
14ee0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
14ef0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 64  ct_end;..  /* Id
14f00 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
14f10 6d 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  mes if we will b
14f20 65 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  e using them in 
14f30 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69  a callback.  Thi
14f40 73 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73  s.  ** step is s
14f50 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75  kipped if the ou
14f60 74 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f  tput is going to
14f70 20 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74   some other dest
14f80 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  ination..  */.  
14f90 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
14fa0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 67  allback ){.    g
14fb0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
14fc0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
14fd0 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
14fe0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
14ff0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
15000 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
15010 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
15020 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
15030 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
15040 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
15050 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
15060 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  W).  for(i=0; i<
15070 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
15080 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
15090 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
150a0 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
150b0 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65   int needRestore
150c0 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 69 66  Context;..    if
150d0 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  ( pTabList->a[i]
150e0 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  .pSelect==0 ) co
150f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
15100 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  pTabList->a[i].z
15110 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
15120 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
15130 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
15140 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
15150 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
15160 6e 74 65 78 74 20 3d 20 70 54 61 62 4c 69 73 74  ntext = pTabList
15170 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
15180 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43      needRestoreC
15190 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20  ontext = 1;.    
151a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65  }else{.      nee
151b0 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20  dRestoreContext 
151c0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
151d0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
151e0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  rse, pTabList->a
151f0 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 53 52 54  [i].pSelect, SRT
15200 5f 54 65 6d 70 54 61 62 6c 65 2c 20 0a 20 20 20  _TempTable, .   
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
15220 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
15230 72 73 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41  rsor, p, i, &isA
15240 67 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gg, 0);.    if( 
15250 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
15260 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
15270 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
15280 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
15290 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
152a0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
152b0 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
152c0 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
152d0 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 55  if( eDest!=SRT_U
152e0 6e 69 6f 6e 20 26 26 20 65 44 65 73 74 21 3d 53  nion && eDest!=S
152f0 52 54 5f 45 78 63 65 70 74 20 26 26 20 65 44 65  RT_Except && eDe
15300 73 74 21 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st!=SRT_Discard 
15310 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42  ){.      pOrderB
15320 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
15330 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72 6f 75  .    }.    pGrou
15340 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
15350 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67 20 3d  y;.    pHaving =
15360 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
15370 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d   isDistinct = p-
15380 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  >isDistinct;.  }
15390 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
153a0 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70 65 63  eck for the spec
153b0 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 6d 69  ial case of a mi
153c0 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e  n() or max() fun
153d0 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a  ction by itself.
153e0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
153f0 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  lt set..  */.  i
15400 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51  f( simpleMinMaxQ
15410 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
15420 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20 29 7b  eDest, iParm) ){
15430 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
15440 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
15450 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
15460 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
15470 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20 74   is a subquery t
15480 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c 61 74  hat can be "flat
15490 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74 73 20  tened" into its 
154a0 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  parent..  ** If 
154b0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 20  flattening is a 
154c0 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f 20 73  possiblity, do s
154d0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  o and return imm
154e0 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f  ediately.  .  */
154f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15500 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20  OMIT_VIEW.  if( 
15510 70 50 61 72 65 6e 74 20 26 26 20 70 50 61 72 65  pParent && pPare
15520 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20 20 66  ntAgg &&.      f
15530 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
15540 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
15550 70 61 72 65 6e 74 54 61 62 2c 20 2a 70 50 61 72  parentTab, *pPar
15560 65 6e 74 41 67 67 2c 20 69 73 41 67 67 29 20 29  entAgg, isAgg) )
15570 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  {.    if( isAgg 
15580 29 20 2a 70 50 61 72 65 6e 74 41 67 67 20 3d 20  ) *pParentAgg = 
15590 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  1;.    goto sele
155a0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64  ct_end;.  }.#end
155b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
155c0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
155d0 20 63 6c 61 75 73 65 2c 20 72 65 73 6f 6c 76 65   clause, resolve
155e0 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
155f0 65 71 75 65 6e 63 65 73 0a 20 20 2a 2a 20 6e 61  equences.  ** na
15600 6d 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  mes that have be
15610 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  en explicitly sp
15620 65 63 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20  ecified..  */.  
15630 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
15640 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15650 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
15660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
15670 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 7a  pOrderBy->a[i].z
15680 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
15690 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
156a0 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 0a 20  Expr->pColl = . 
156b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
156c0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
156d0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
156e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 2d 31  ->a[i].zName, -1
156f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15700 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
15710 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67  >nErr ){.      g
15720 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
15730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15740 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
15750 0a 20 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  .  */.  computeL
15760 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
15770 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  arse, p);..  /* 
15780 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
15790 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
157a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
157b0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
157c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
157d0 73 74 3d 3d 53 52 54 5f 54 65 6d 70 54 61 62 6c  st==SRT_TempTabl
157e0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
157f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15800 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61  OpenVirtual, iPa
15810 72 6d 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rm, 0);.    sqli
15820 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15830 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
15840 2c 20 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  , iParm, pEList-
15850 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
15860 2f 2a 20 44 6f 20 61 6e 20 61 6e 61 6c 79 73 69  /* Do an analysi
15870 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 65  s of aggregate e
15880 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
15890 0a 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20  .  if( isAgg || 
158a0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
158b0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
158c0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
158d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
158e0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
158f0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
15900 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
15910 54 61 62 4c 69 73 74 3b 0a 0a 20 20 20 20 61 73  TabList;..    as
15920 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 41  sert( pParse->nA
15930 67 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 73 41  gg==0 );.    isA
15940 67 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  gg = 1;.    for(
15950 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
15960 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15970 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
15980 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
15990 65 73 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 2d  es(&sNC, pEList-
159a0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
159b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
159c0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
159d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
159e0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
159f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 47 72 6f   for(i=0; i<pGro
15a00 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
15a10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
15a20 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
15a30 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
15a40 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69 5d  , pGroupBy->a[i]
15a50 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
15a60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
15a70 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
15a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15a90 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 26 26    if( pHaving &&
15aa0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
15ab0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
15ac0 4e 43 2c 20 70 48 61 76 69 6e 67 29 20 29 7b 0a  NC, pHaving) ){.
15ad0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
15ae0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
15af0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
15b00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15b10 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
15b20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
15b30 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
15b40 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
15b50 73 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  s(&sNC, pOrderBy
15b60 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
15b70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
15b80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15b90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15ba0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
15bb0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
15bc0 6f 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  or.  */.  if( is
15bd0 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  Agg ){.    int a
15be0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15bf0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
15c00 52 65 73 65 74 2c 20 28 70 47 72 6f 75 70 42 79  Reset, (pGroupBy
15c10 3f 30 3a 31 29 2c 20 70 50 61 72 73 65 2d 3e 6e  ?0:1), pParse->n
15c20 41 67 67 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Agg);.    for(i=
15c30 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
15c40 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
15c50 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 3b 0a 20  uncDef *pFunc;. 
15c60 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 20       if( (pFunc 
15c70 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69  = pParse->aAgg[i
15c80 5d 2e 70 46 75 6e 63 29 21 3d 30 20 26 26 20 70  ].pFunc)!=0 && p
15c90 46 75 6e 63 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  Func->xFinalize!
15ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
15cb0 74 20 6e 45 78 70 72 20 3d 20 30 3b 0a 23 69 66  t nExpr = 0;.#if
15cc0 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
15cd0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 67         Expr *pAg
15ce0 67 45 78 70 72 20 3d 20 70 50 61 72 73 65 2d 3e  gExpr = pParse->
15cf0 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  aAgg[i].pExpr;. 
15d00 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 45         if( pAggE
15d10 78 70 72 20 26 26 20 70 41 67 67 45 78 70 72 2d  xpr && pAggExpr-
15d20 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
15d30 20 20 20 20 6e 45 78 70 72 20 3d 20 70 41 67 67      nExpr = pAgg
15d40 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
15d50 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  pr;.        }.#e
15d60 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
15d70 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
15d80 50 5f 41 67 67 49 6e 69 74 2c 20 6e 45 78 70 72  P_AggInit, nExpr
15d90 2c 20 69 2c 20 28 63 68 61 72 2a 29 70 46 75 6e  , i, (char*)pFun
15da0 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P3_FUNCDEF);.
15db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15dc0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
15dd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
15de0 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
15df0 20 2b 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   + pGroupBy->nEx
15e00 70 72 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  pr*sizeof(CollSe
15e10 71 2a 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  q*);.      KeyIn
15e20 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49  fo *pKey = (KeyI
15e30 6e 66 6f 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  nfo *)sqliteMall
15e40 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  oc(sz);.      if
15e50 28 20 30 3d 3d 70 4b 65 79 20 29 7b 0a 20 20 20  ( 0==pKey ){.   
15e60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
15e70 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
15e80 20 20 20 20 70 4b 65 79 2d 3e 65 6e 63 20 3d 20      pKey->enc = 
15e90 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
15ea0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69  .      pKey->nFi
15eb0 65 6c 64 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  eld = pGroupBy->
15ec0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 66 6f 72  nExpr;.      for
15ed0 28 69 3d 30 3b 20 69 3c 70 47 72 6f 75 70 42 79  (i=0; i<pGroupBy
15ee0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15ef0 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f         pKey->aCo
15f00 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[i] = sqlite3E
15f10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
15f20 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 69  e, pGroupBy->a[i
15f30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
15f40 20 20 69 66 28 20 21 70 4b 65 79 2d 3e 61 43 6f    if( !pKey->aCo
15f50 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
15f60 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
15f70 5d 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  ] = pParse->db->
15f80 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
15f90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15fa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15fb0 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20  angeP3(v, addr, 
15fc0 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 33  (char *)pKey, P3
15fd0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
15fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15ff0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
16000 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  e memory cell to
16010 20 4e 55 4c 4c 20 66 6f 72 20 53 52 54 5f 4d 65   NULL for SRT_Me
16020 6d 20 6f 72 20 30 20 66 6f 72 20 53 52 54 5f 45  m or 0 for SRT_E
16030 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 69 66 28  xists.  */.  if(
16040 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
16050 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  || eDest==SRT_Ex
16060 69 73 74 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  ists ){.    sqli
16070 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
16080 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 3f  eDest==SRT_Mem ?
16090 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 49 6e   OP_Null : OP_In
160a0 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
160b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
160c0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
160d0 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
160e0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 74  }..  /* Open a t
160f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
16100 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
16110 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
16120 0a 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63  .  if( isDistinc
16130 74 20 29 7b 0a 20 20 20 20 64 69 73 74 69 6e 63  t ){.    distinc
16140 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
16150 2b 2b 3b 0a 20 20 20 20 6f 70 65 6e 56 69 72 74  ++;.    openVirt
16160 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ualIndex(pParse,
16170 20 70 2c 20 64 69 73 74 69 6e 63 74 29 3b 0a 20   p, distinct);. 
16180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
16190 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
161a0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
161b0 61 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 2a  atabase scan.  *
161c0 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  /.  pWInfo = sql
161d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
161e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
161f0 20 70 57 68 65 72 65 2c 0a 20 20 20 20 20 20 20   pWhere,.       
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3f        pGroupBy ?
16220 20 30 20 3a 20 26 70 4f 72 64 65 72 42 79 29 3b   0 : &pOrderBy);
16230 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30  .  if( pWInfo==0
16240 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
16250 6e 64 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 74 68  nd;..  /* Use th
16260 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
16270 20 6c 6f 6f 70 20 69 66 20 77 65 20 61 72 65 20   loop if we are 
16280 6e 6f 74 20 64 65 61 6c 69 6e 67 20 77 69 74 68  not dealing with
16290 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73  .  ** aggregates
162a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  .  */.  if( !isA
162b0 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 65  gg ){.    if( se
162c0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
162d0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
162e0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
162f0 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
16300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16310 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
16320 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
16330 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
16340 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67  aff) ){.       g
16350 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
16360 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16370 49 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  If we are dealin
16380 67 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  g with aggregate
16390 73 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 73  s, then do the s
163a0 70 65 63 69 61 6c 20 61 67 67 72 65 67 61 74 65  pecial aggregate
163b0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  .  ** processing
163c0 2e 20 20 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  .  .  */.  else{
163d0 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 70 41  .    AggExpr *pA
163e0 67 67 3b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 31  gg;.    int lbl1
163f0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65   = 0;.    pParse
16400 2d 3e 66 69 6c 6c 41 67 67 20 3d 20 31 3b 0a 20  ->fillAgg = 1;. 
16410 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
16420 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16430 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
16440 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
16450 79 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20  y);.      /* No 
16460 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
16470 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  is attached to t
16480 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 4f 50 5f  he following OP_
16490 4d 61 6b 65 52 65 63 6f 72 64 20 0a 20 20 20 20  MakeRecord .    
164a0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 77 65 20    ** because we 
164b0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64  do not need to d
164c0 6f 20 61 6e 79 20 63 6f 65 72 63 69 6f 6e 20 6f  o any coercion o
164d0 66 20 64 61 74 61 74 79 70 65 73 2e 20 2a 2f 0a  f datatypes. */.
164e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
164f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
16500 65 52 65 63 6f 72 64 2c 20 70 47 72 6f 75 70 42  eRecord, pGroupB
16510 79 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20  y->nExpr, 0);.  
16520 20 20 20 20 6c 62 6c 31 20 3d 20 73 71 6c 69 74      lbl1 = sqlit
16530 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
16540 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16550 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
16560 5f 41 67 67 46 6f 63 75 73 2c 20 30 2c 20 6c 62  _AggFocus, 0, lb
16570 6c 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  l1);.    }.    f
16580 6f 72 28 69 3d 30 2c 20 70 41 67 67 3d 70 50 61  or(i=0, pAgg=pPa
16590 72 73 65 2d 3e 61 41 67 67 3b 20 69 3c 70 50 61  rse->aAgg; i<pPa
165a0 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 2c 20  rse->nAgg; i++, 
165b0 70 41 67 67 2b 2b 29 7b 0a 20 20 20 20 20 20 69  pAgg++){.      i
165c0 66 28 20 70 41 67 67 2d 3e 69 73 41 67 67 20 29  f( pAgg->isAgg )
165d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
165e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
165f0 28 70 50 61 72 73 65 2c 20 70 41 67 67 2d 3e 70  (pParse, pAgg->p
16600 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
16610 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
16620 20 4f 50 5f 41 67 67 53 65 74 2c 20 30 2c 20 69   OP_AggSet, 0, i
16630 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
16640 72 73 65 2d 3e 66 69 6c 6c 41 67 67 20 3d 20 30  rse->fillAgg = 0
16650 3b 0a 20 20 20 20 69 66 28 20 6c 62 6c 31 3c 30  ;.    if( lbl1<0
16660 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16670 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16680 6c 28 76 2c 20 6c 62 6c 31 29 3b 0a 20 20 20 20  l(v, lbl1);.    
16690 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  }.    for(i=0, p
166a0 41 67 67 3d 70 50 61 72 73 65 2d 3e 61 41 67 67  Agg=pParse->aAgg
166b0 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
166c0 3b 20 69 2b 2b 2c 20 70 41 67 67 2b 2b 29 7b 0a  ; i++, pAgg++){.
166d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a        Expr *pE;.
166e0 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
166f0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
16700 70 44 65 66 3b 0a 20 20 20 20 20 20 69 66 28 20  pDef;.      if( 
16710 21 70 41 67 67 2d 3e 69 73 41 67 67 20 29 20 63  !pAgg->isAgg ) c
16720 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
16730 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75  ssert( pAgg->pFu
16740 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nc!=0 );.      a
16750 73 73 65 72 74 28 20 70 41 67 67 2d 3e 70 46 75  ssert( pAgg->pFu
16760 6e 63 2d 3e 78 53 74 65 70 21 3d 30 20 29 3b 0a  nc->xStep!=0 );.
16770 20 20 20 20 20 20 70 44 65 66 20 3d 20 70 41 67        pDef = pAg
16780 67 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  g->pFunc;.      
16790 70 45 20 3d 20 70 41 67 67 2d 3e 70 45 78 70 72  pE = pAgg->pExpr
167a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
167b0 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pE!=0 );.      a
167c0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 3d 3d 54  ssert( pE->op==T
167d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
167e0 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
167f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
16800 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
16810 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
16820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16830 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
16840 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , i, 0);.      i
16850 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
16860 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
16870 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
16880 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
16890 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
168a0 3d 30 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  =0; !pColl && j<
168b0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
168c0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
168d0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
168e0 71 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  q(pParse, pE->pL
168f0 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29  ist->a[j].pExpr)
16900 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16910 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
16920 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
16930 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
16940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16950 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
16960 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
16970 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
16980 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
16990 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
169a0 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 75  eOp3(v, OP_AggFu
169b0 6e 63 2c 20 30 2c 20 6e 45 78 70 72 2c 20 28 63  nc, 0, nExpr, (c
169c0 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55  har*)pDef, P3_FU
169d0 4e 43 44 45 46 29 3b 0a 20 20 20 20 7d 0a 20 20  NCDEF);.    }.  
169e0 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  }..  /* End the 
169f0 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
16a00 6f 70 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  op..  */.  sqlit
16a10 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
16a20 6f 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  o);..  /* If we 
16a30 61 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  are processing a
16a40 67 67 72 65 67 61 74 65 73 2c 20 77 65 20 6e 65  ggregates, we ne
16a50 65 64 20 74 6f 20 73 65 74 20 75 70 20 61 20 73  ed to set up a s
16a60 65 63 6f 6e 64 20 6c 6f 6f 70 0a 20 20 2a 2a 20  econd loop.  ** 
16a70 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
16a80 61 67 67 72 65 67 61 74 65 20 76 61 6c 75 65 73  aggregate values
16a90 20 61 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65   and process the
16aa0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  m..  */.  if( is
16ab0 41 67 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  Agg ){.    int e
16ac0 6e 64 61 67 67 20 3d 20 73 71 6c 69 74 65 33 56  ndagg = sqlite3V
16ad0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16ae0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 61 67  .    int startag
16af0 67 3b 0a 20 20 20 20 73 74 61 72 74 61 67 67 20  g;.    startagg 
16b00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16b10 4f 70 28 76 2c 20 4f 50 5f 41 67 67 4e 65 78 74  Op(v, OP_AggNext
16b20 2c 20 30 2c 20 65 6e 64 61 67 67 29 3b 0a 20 20  , 0, endagg);.  
16b30 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
16b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16b50 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
16b60 2c 20 70 48 61 76 69 6e 67 2c 20 73 74 61 72 74  , pHaving, start
16b70 61 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  agg, 1);.    }. 
16b80 20 20 20 69 66 28 20 73 65 6c 65 63 74 49 6e 6e     if( selectInn
16b90 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
16ba0 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
16bb0 70 4f 72 64 65 72 42 79 2c 20 64 69 73 74 69 6e  pOrderBy, distin
16bc0 63 74 2c 20 65 44 65 73 74 2c 0a 20 20 20 20 20  ct, eDest,.     
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16be0 50 61 72 6d 2c 20 73 74 61 72 74 61 67 67 2c 20  Parm, startagg, 
16bf0 65 6e 64 61 67 67 2c 20 61 66 66 29 20 29 7b 0a  endagg, aff) ){.
16c00 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
16c10 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
16c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16c30 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
16c40 20 73 74 61 72 74 61 67 67 29 3b 0a 20 20 20 20   startagg);.    
16c50 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16c60 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 61 67  veLabel(v, endag
16c70 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
16c80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
16c90 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  oop, 0, 0);.  }.
16ca0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16cb0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
16cc0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
16cd0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
16ce0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
16cf0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
16d00 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
16d10 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
16d20 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
16d30 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
16d40 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
16d50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
16d60 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
16d70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16d80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
16d90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
16da0 20 61 20 73 75 62 71 75 65 72 79 2c 20 77 65 20   a subquery, we 
16db0 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74  have now convert
16dc0 65 64 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ed the subquery 
16dd0 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70  into a.  ** temp
16de0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 53 6f  orary table.  So
16df0 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 71   delete the subq
16e00 75 65 72 79 20 73 74 72 75 63 74 75 72 65 20 66  uery structure f
16e10 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 0a 20  rom the parent. 
16e20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74   ** to prevent t
16e30 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f  his subquery fro
16e40 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  m being evaluate
16e50 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66  d again and to f
16e60 6f 72 63 65 20 74 68 65 0a 20 20 2a 2a 20 74 68  orce the.  ** th
16e70 65 20 75 73 65 20 6f 66 20 74 68 65 20 74 65 6d  e use of the tem
16e80 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20  porary table..  
16e90 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
16ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16eb0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e  pParent->pSrc->n
16ec0 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b  Src>parentTab );
16ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16ee0 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
16ef0 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
16f00 3d 3d 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==p );.    sqlit
16f10 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
16f20 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  );.    pParent->
16f30 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
16f40 62 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  b].pSelect = 0;.
16f50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16f60 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
16f70 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
16f80 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
16f90 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
16fa0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
16fb0 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
16fc0 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
16fd0 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
16fe0 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
16ff0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
17000 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
17010 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
17020 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
17030 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
17040 74 5f 65 6e 64 3a 0a 20 20 72 65 73 74 6f 72 65  t_end:.  restore
17050 41 67 67 72 65 67 61 74 65 49 6e 66 6f 28 70 50  AggregateInfo(pP
17060 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
17070 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17080 0a                                               .