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

Artifact d43bbdedb843a91b728531c831f3ed04846b920d:


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 33 34 34  select.c,v 1.344
0200: 20 32 30 30 37 2f 30 35 2f 31 30 20 31 30 3a 34   2007/05/10 10:4
0210: 36 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  6:57 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
0250: 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  all the content 
0260: 6f 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75  of a Select stru
0270: 63 74 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74  cture but do not
0280: 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74   deallocate.** t
0290: 68 65 20 73 65 6c 65 63 74 20 73 74 72 75 63 74  he select struct
02a0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ure itself..*/.s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
02c0: 53 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70  Select(Select *p
02d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
02e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 45  ListDelete(p->pE
02f0: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
0300: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  SrcListDelete(p-
0310: 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  >pSrc);.  sqlite
0320: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
0330: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
0340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0350: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0370: 65 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  e(p->pHaving);. 
0380: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0390: 44 65 6c 65 74 65 28 70 2d 3e 70 4f 72 64 65 72  Delete(p->pOrder
03a0: 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  By);.  sqlite3Se
03b0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 50  lectDelete(p->pP
03c0: 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  rior);.  sqlite3
03d0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
03e0: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
03f0: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4f  ExprDelete(p->pO
0400: 66 66 73 65 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ffset);.}.../*.*
0410: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
0420: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
0430: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a  ointer to that.*
0450: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
0460: 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53  Select *sqlite3S
0470: 65 6c 65 63 74 4e 65 77 28 0a 20 20 45 78 70 72  electNew(.  Expr
0480: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
0490: 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d    /* which colum
04a0: 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e  ns to include in
04b0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
04c0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
04d0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
04e0: 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69  OM clause -- whi
04f0: 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61  ch tables to sca
0500: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  n */.  Expr *pWh
0510: 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
0520: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
0530: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0540: 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74  pGroupBy,   /* t
0550: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
0560: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  se */.  Expr *pH
0570: 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a  aving,        /*
0580: 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
0590: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
05a0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
05b0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
05c0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ause */.  int is
05d0: 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  Distinct,       
05e0: 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44  /* true if the D
05f0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0600: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0610: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
0620: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
0630: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0640: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
0650: 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20  Expr *pOffset   
0660: 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20        /* OFFSET 
0670: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0680: 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a  ns no offset */.
0690: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
06a0: 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e  w;.  Select stan
06b0: 64 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  din;.  pNew = sq
06c0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
06d0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61  of(*pNew) );.  a
06e0: 73 73 65 72 74 28 20 21 70 4f 66 66 73 65 74 20  ssert( !pOffset 
06f0: 7c 7c 20 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f  || pLimit );   /
0700: 2a 20 43 61 6e 27 74 20 68 61 76 65 20 4f 46 46  * Can't have OFF
0710: 53 45 54 20 77 69 74 68 6f 75 74 20 4c 49 4d 49  SET without LIMI
0720: 54 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  T. */.  if( pNew
0730: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
0740: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20  = &standin;.    
0750: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
0760: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
0770: 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74    }.  if( pEList
0780: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73  ==0 ){.    pELis
0790: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
07a0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 73 71 6c  istAppend(0, sql
07b0: 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c  ite3Expr(TK_ALL,
07c0: 30 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d 0a  0,0,0), 0);.  }.
07d0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
07e0: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
07f0: 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
0800: 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70  pNew->pWhere = p
0810: 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70  Where;.  pNew->p
0820: 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
0830: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76  By;.  pNew->pHav
0840: 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20  ing = pHaving;. 
0850: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
0860: 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e  = pOrderBy;.  pN
0870: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
0880: 20 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70   isDistinct;.  p
0890: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
08a0: 45 43 54 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ECT;.  assert( p
08b0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69  Offset==0 || pLi
08c0: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77  mit!=0 );.  pNew
08d0: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
08e0: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  t;.  pNew->pOffs
08f0: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
0900: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
0910: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
0920: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
0930: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
0940: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61   = -1;.  pNew->a
0950: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
0960: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
0970: 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
0980: 31 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 26  1;.  if( pNew==&
0990: 73 74 61 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63  standin) {.    c
09a0: 6c 65 61 72 53 65 6c 65 63 74 28 70 4e 65 77 29  learSelect(pNew)
09b0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
09c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
09d0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
09e0: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
09f0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0a00: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0a10: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0a20: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0a30: 74 44 65 6c 65 74 65 28 53 65 6c 65 63 74 20 2a  tDelete(Select *
0a40: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
0a50: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
0a60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
0a70: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
0a80: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
0a90: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
0aa0: 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20  eeding the JOIN 
0ab0: 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69  keyword, determi
0ac0: 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f  ne the.** type o
0ad0: 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20  f join.  Return 
0ae0: 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
0af0: 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73  ant that express
0b00: 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20  es that type.** 
0b10: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
0b20: 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61  following bit va
0b30: 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lues:.**.**     
0b40: 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20  JT_INNER.**     
0b50: 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20  JT_CROSS.**     
0b60: 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20  JT_OUTER.**     
0b70: 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20  JT_NATURAL.**   
0b80: 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20    JT_LEFT.**    
0b90: 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20   JT_RIGHT.**.** 
0ba0: 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69  A full outer joi
0bb0: 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61  n is the combina
0bc0: 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20  tion of JT_LEFT 
0bd0: 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a  and JT_RIGHT..**
0be0: 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61  .** If an illega
0bf0: 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  l or unsupported
0c00: 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65   join type is se
0c10: 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  en, then still r
0c20: 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20  eturn.** a join 
0c30: 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e  type, but put an
0c40: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50   error in the pP
0c50: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
0c60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f  */.int sqlite3Jo
0c70: 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  inType(Parse *pP
0c80: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c  arse, Token *pA,
0c90: 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65   Token *pB, Toke
0ca0: 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f  n *pC){.  int jo
0cb0: 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f  intype = 0;.  To
0cc0: 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20  ken *apAll[3];. 
0cd0: 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61   Token *p;.  sta
0ce0: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
0cf0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
0d00: 72 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20  r zKeyword[8];. 
0d10: 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20     u8 nChar;.   
0d20: 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65   u8 code;.  } ke
0d30: 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20  ywords[] = {.   
0d40: 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c   { "natural", 7,
0d50: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20   JT_NATURAL },. 
0d60: 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20     { "left",    
0d70: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
0d80: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69  TER },.    { "ri
0d90: 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49  ght",   5, JT_RI
0da0: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0db0: 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20      { "full",   
0dc0: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
0dd0: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0de0: 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20  .    { "outer", 
0df0: 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c    5, JT_OUTER },
0e00: 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20  .    { "inner", 
0e10: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0e20: 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20  .    { "cross", 
0e30: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54    5, JT_INNER|JT
0e40: 5f 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20  _CROSS },.  };. 
0e50: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41   int i, j;.  apA
0e60: 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70  ll[0] = pA;.  ap
0e70: 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61  All[1] = pB;.  a
0e80: 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20  pAll[2] = pC;.  
0e90: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20  for(i=0; i<3 && 
0ea0: 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  apAll[i]; i++){.
0eb0: 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d      p = apAll[i]
0ec0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
0ed0: 3c 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  <sizeof(keywords
0ee0: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
0ef0: 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  s[0]); j++){.   
0f00: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79     if( p->n==key
0f10: 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a  words[j].nChar .
0f20: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
0f30: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
0f40: 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  ar*)p->z, keywor
0f50: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
0f60: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
0f70: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
0f80: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
0f90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
0fa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0fb0: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
0fc0: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
0fd0: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
0fe0: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
0ff0: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
1000: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1010: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
1020: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
1030: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
1040: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
1050: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1060: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1070: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 31  const char *zSp1
1090: 20 3d 20 22 20 22 3b 0a 20 20 20 20 63 6f 6e 73   = " ";.    cons
10a0: 74 20 63 68 61 72 20 2a 7a 53 70 32 20 3d 20 22  t char *zSp2 = "
10b0: 20 22 3b 0a 20 20 20 20 69 66 28 20 70 42 3d 3d   ";.    if( pB==
10c0: 30 20 29 7b 20 7a 53 70 31 2b 2b 3b 20 7d 0a 20  0 ){ zSp1++; }. 
10d0: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
10e0: 7a 53 70 32 2b 2b 3b 20 7d 0a 20 20 20 20 73 71  zSp2++; }.    sq
10f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1100: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
1110: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
1120: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
1130: 20 20 22 25 54 25 73 25 54 25 73 25 54 22 2c 20    "%T%s%T%s%T", 
1140: 70 41 2c 20 7a 53 70 31 2c 20 70 42 2c 20 7a 53  pA, zSp1, pB, zS
1150: 70 32 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69  p2, pC);.    joi
1160: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
1170: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f  ;.  }else if( jo
1180: 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48  intype & JT_RIGH
1190: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
11a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11b0: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
11c0: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
11d0: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
11e0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
11f0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
1200: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
1210: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
1220: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1230: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1240: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1250: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1260: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1270: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1280: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
12a0: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
12b0: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
12c0: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
12d0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
12e0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
12f0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1300: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1310: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1320: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1330: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1340: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  -1;.}../*.** Set
1350: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
1360: 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30  token to a '\000
1370: 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  '-terminated str
1380: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
1390: 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b  oid setToken(Tok
13a0: 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  en *p, const cha
13b0: 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20  r *z){.  p->z = 
13c0: 28 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d  (u8*)z;.  p->n =
13d0: 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a   z ? strlen(z) :
13e0: 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30   0;.  p->dyn = 0
13f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1400: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1410: 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e  node for an iden
1420: 74 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20  tifier with the 
1430: 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f  name of zName.*/
1440: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72  .Expr *sqlite3Cr
1450: 65 61 74 65 49 64 45 78 70 72 28 63 6f 6e 73 74  eateIdExpr(const
1460: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1470: 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20   Token dummy;.  
1480: 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c  setToken(&dummy,
1490: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
14a0: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  n sqlite3Expr(TK
14b0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
14c0: 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  y);.}.../*.** Ad
14d0: 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20  d a term to the 
14e0: 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e  WHERE expression
14f0: 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74   in *ppExpr that
1500: 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a   requires the.**
1510: 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20   zCol column to 
1520: 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20  be equal in the 
1530: 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31  two tables pTab1
1540: 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73   and pTab2..*/.s
1550: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
1560: 65 72 65 54 65 72 6d 28 0a 20 20 63 6f 6e 73 74  ereTerm(.  const
1570: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1580: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1590: 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
15a0: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
15b0: 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  1,      /* First
15c0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
15d0: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c  t char *zAlias1,
15e0: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
15f0: 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20  r first table.  
1600: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1610: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1620: 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63  ab2,      /* Sec
1630: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ond table */.  c
1640: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1650: 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s2,     /* Alias
1660: 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c   for second tabl
1670: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1680: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a  */.  int iRightJ
1690: 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a  oinTable,     /*
16a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
16b0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
16c0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
16d0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
16e0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
16f0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
1700: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
1710: 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a  .  Expr *pE1a, *
1720: 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45  pE1b, *pE1c;.  E
1730: 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62  xpr *pE2a, *pE2b
1740: 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20  , *pE2c;.  Expr 
1750: 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73  *pE;..  pE1a = s
1760: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1770: 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61  pr(zCol);.  pE2a
1780: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1790: 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20  IdExpr(zCol);.  
17a0: 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29  if( zAlias1==0 )
17b0: 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20  {.    zAlias1 = 
17c0: 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pTab1->zName;.  
17d0: 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69 74  }.  pE1b = sqlit
17e0: 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28 7a  e3CreateIdExpr(z
17f0: 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a  Alias1);.  if( z
1800: 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20  Alias2==0 ){.   
1810: 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32   zAlias2 = pTab2
1820: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1830: 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2b = sqlite3Cre
1840: 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73  ateIdExpr(zAlias
1850: 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c  2);.  pE1c = sql
1860: 69 74 65 33 45 78 70 72 4f 72 46 72 65 65 28 54  ite3ExprOrFree(T
1870: 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31  K_DOT, pE1b, pE1
1880: 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20  a, 0);.  pE2c = 
1890: 73 71 6c 69 74 65 33 45 78 70 72 4f 72 46 72 65  sqlite3ExprOrFre
18a0: 65 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20  e(TK_DOT, pE2b, 
18b0: 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d  pE2a, 0);.  pE =
18c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4f 72 46 72   sqlite3ExprOrFr
18d0: 65 65 28 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20  ee(TK_EQ, pE1c, 
18e0: 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  pE2c, 0);.  if( 
18f0: 70 45 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  pE ){.    ExprSe
1900: 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  tProperty(pE, EP
1910: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
1920: 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pE->iRightJoinTa
1930: 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e  ble = iRightJoin
1940: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 45 20  Table;.  }.  pE 
1950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
1960: 28 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 20  (*ppExpr, pE);. 
1970: 20 69 66 28 20 70 45 20 29 7b 0a 20 20 20 20 2a   if( pE ){.    *
1980: 70 70 45 78 70 72 20 3d 20 70 45 3b 0a 20 20 7d  ppExpr = pE;.  }
1990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
19a0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
19b0: 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65  operty on all te
19c0: 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  rms of the given
19d0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
19e0: 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72  And set the Expr
19f0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
1a00: 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65   to iTable for e
1a10: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
1a20: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  .** expression..
1a30: 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f  **.** The EP_Fro
1a40: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69  mJoin property i
1a50: 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20  s used on terms 
1a60: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
1a70: 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20   to tell.** the 
1a80: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1a90: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
1aa0: 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20   that this term 
1ab0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a  is part of the.*
1ac0: 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69  * join restricti
1ad0: 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  on specified in 
1ae0: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
1af0: 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61  clause and not a
1b00: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
1b10: 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45  more general WHE
1b20: 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73  RE clause.  Thes
1b30: 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65  e terms are move
1b40: 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a  d over to the.**
1b50: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75   WHERE clause du
1b60: 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73  ring join proces
1b70: 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64  sing but we need
1b80: 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1b90: 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e  t they.** origin
1ba0: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
1bb0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
1bc0: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
1bd0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
1be0: 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63  ells the WHERE c
1bf0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
1c00: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70   that the.** exp
1c10: 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20  ression depends 
1c20: 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a  on table iRightJ
1c30: 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66  oinTable even if
1c40: 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e   that table is n
1c50: 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79  ot.** explicitly
1c60: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
1c70: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  e expression.  T
1c80: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  hat information 
1c90: 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72  is needed.** for
1ca0: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
1cb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
1cc0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
1cd0: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
1ce0: 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35  =t2.b AND t1.x=5
1cf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65  .**.** The where
1d00: 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f   clause needs to
1d10: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
1d20: 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d  ing of the t1.x=
1d30: 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20  5.** term until 
1d40: 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f  after the t2 loo
1d50: 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  p of the join.  
1d60: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a  In that way, a.*
1d70: 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69  * NULL t2 row wi
1d80: 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77  ll be inserted w
1d90: 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e  henever t1.x!=5.
1da0: 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a    If we do not.*
1db0: 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  * defer the hand
1dc0: 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20  ling of t1.x=5, 
1dd0: 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65  it will be proce
1de0: 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ssed immediately
1df0: 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31  .** after the t1
1e00: 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77   loop and rows w
1e10: 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c  ith t1.x!=5 will
1e20: 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e   never appear in
1e30: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20  .** the output, 
1e40: 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65  which is incorre
1e50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
1e60: 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45  id setJoinExpr(E
1e70: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  xpr *p, int iTab
1e80: 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20  le){.  while( p 
1e90: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
1ea0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
1eb0: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69  mJoin);.    p->i
1ec0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1ed0: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74   iTable;.    set
1ee0: 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66  JoinExpr(p->pLef
1ef0: 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  t, iTable);.    
1f00: 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20  p = p->pRight;. 
1f10: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   } .}../*.** Thi
1f20: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
1f30: 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66  ses the join inf
1f40: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53  ormation for a S
1f50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1f60: 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  .** ON and USING
1f70: 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e   clauses are con
1f80: 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72  verted into extr
1f90: 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  a terms of the W
1fa0: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  HERE clause..** 
1fb0: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c  NATURAL joins al
1fc0: 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20  so create extra 
1fd0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1fe0: 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65  ms..**.** The te
1ff0: 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  rms of a FROM cl
2000: 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e  ause are contain
2010: 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74  ed in the Select
2020: 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e  .pSrc structure.
2030: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73  .** The left mos
2040: 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66  t table is the f
2050: 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65  irst entry in Se
2060: 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20  lect.pSrc.  The 
2070: 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61  right-most.** ta
2080: 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20  ble is the last 
2090: 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e  entry.  The join
20a0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c   operator is hel
20b0: 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  d in the entry t
20c0: 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20  o.** the left.  
20d0: 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e  Thus entry 0 con
20e0: 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f  tains the join o
20f0: 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  perator for the 
2100: 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  join between.** 
2110: 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e  entries 0 and 1.
2120: 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e    Any ON or USIN
2130: 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69  G clauses associ
2140: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f  ated with the jo
2150: 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61  in are.** also a
2160: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
2170: 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  eft entry..**.**
2180: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2190: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
21a0: 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
21b0: 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ntered..*/.stati
21c0: 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63  c int sqliteProc
21d0: 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70  essJoin(Parse *p
21e0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
21f0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
2200: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2210: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c       /* All tabl
2220: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2230: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
2240: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2260: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2270: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2280: 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20  item *pLeft;    
2290: 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62   /* Left table b
22a0: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20  eing joined */. 
22b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22c0: 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20  item *pRight;   
22d0: 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20   /* Right table 
22e0: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
22f0: 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
2300: 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53  c;.  pLeft = &pS
2310: 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67  rc->a[0];.  pRig
2320: 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a  ht = &pLeft[1];.
2330: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
2340: 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20  c->nSrc-1; i++, 
2350: 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b  pRight++, pLeft+
2360: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2370: 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d  LeftTab = pLeft-
2380: 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65  >pTab;.    Table
2390: 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52   *pRightTab = pR
23a0: 69 67 68 74 2d 3e 70 54 61 62 3b 0a 0a 20 20 20  ight->pTab;..   
23b0: 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30   if( pLeftTab==0
23c0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
23d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
23e0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
23f0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
2400: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
2410: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2420: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2430: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2440: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2450: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2460: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2470: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2480: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2490: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
24a0: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
24b0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
24c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24d0: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
24e0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
24f0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2500: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2510: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2520: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2540: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54  or(j=0; j<pLeftT
2550: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2560: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2570: 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e  ame = pLeftTab->
2580: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2590: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
25a0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
25b0: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
25c0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
25d0: 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65  eTerm(zName, pLe
25e0: 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41  ftTab, pLeft->zA
25f0: 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lias, .         
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
2620: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a  pRight->zAlias,.
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2650: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
2660: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2670: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
2680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2690: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
26a0: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
26b0: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
26c0: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
26d0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
26e0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
26f0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
2700: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2710: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
2720: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
2730: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
2740: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
2750: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
2760: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2770: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
2780: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
2790: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
27a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
27b0: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
27c0: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
27d0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
27e0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
27f0: 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
2800: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
2810: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2820: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
2830: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
2840: 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  And(p->pWhere, p
2850: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
2860: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
2870: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2880: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
2890: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
28a0: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
28b0: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
28c0: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
28d0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
28e0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
28f0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
2900: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
2910: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
2920: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
2930: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
2940: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
2950: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
2960: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
2970: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
2980: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
2990: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
29a0: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
29b0: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
29c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
29d0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
29e0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
29f0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
2a00: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
2a10: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
2a20: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
2a30: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
2a40: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
2a50: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
2a60: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
2a70: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
2a80: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
2a90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2aa0: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2ab0: 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29  pLeftTab, zName)
2ac0: 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65  <0 || columnInde
2ad0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
2ae0: 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  me)<0 ){.       
2af0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b00: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
2b10: 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f  ot join using co
2b20: 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e  lumn %s - column
2b30: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
2b40: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62  not present in b
2b50: 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61  oth tables", zNa
2b60: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  me);.          r
2b70: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2b80: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68   }.        addWh
2b90: 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70  ereTerm(zName, p
2ba0: 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e  LeftTab, pLeft->
2bb0: 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20  zAlias, .       
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
2be0: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a  pRight->zAlias,.
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2c10: 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d  ht->iCursor, &p-
2c20: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
2c30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2c40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2c50: 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74   Insert code int
2c60: 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20  o "v" that will 
2c70: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
2c80: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
2c90: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20  e.** stack into 
2ca0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
2cb0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
2cc0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
2cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2ce0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
2cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
2d00: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
2d10: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
2d20: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
2d30: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
2d40: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
2d50: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2d60: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
2d70: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2d80: 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  be;.  sqlite3Exp
2d90: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
2da0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
2db0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2dc0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  dOp(v, OP_Sequen
2dd0: 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  ce, pOrderBy->iE
2de0: 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71  Cursor, 0);.  sq
2df0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2e00: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65  , OP_Pull, pOrde
2e10: 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20  rBy->nExpr + 1, 
2e20: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
2e30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
2e40: 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72 42  eRecord, pOrderB
2e50: 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30 29  y->nExpr + 2, 0)
2e60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2e70: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
2e80: 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  sert, pOrderBy->
2e90: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
2ea0: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  if( pSelect->iLi
2eb0: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  mit>=0 ){.    in
2ec0: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
2ed0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
2ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2ef0: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 53  OP_IfMemZero, pS
2f00: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c  elect->iLimit+1,
2f10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f30: 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 53 65  MemIncr, -1, pSe
2f40: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 29 3b  lect->iLimit+1);
2f50: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
2f60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2f70: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b   OP_Goto, 0, 0);
2f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f90: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2fa0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
2fb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c  dbeAddOp(v, OP_L
2fc0: 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ast, pOrderBy->i
2fd0: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20  ECursor, 0);.   
2fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ff0: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
3000: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3010: 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  or, 0);.    sqli
3020: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3030: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70  v, addr2);.    p
3040: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
3050: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
3060: 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d  * Add code to im
3070: 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53  plement the OFFS
3080: 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ET.*/.static voi
3090: 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20  d codeOffset(.  
30a0: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
30b0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
30c0: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20  de into this VM 
30d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
30e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
30f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
3100: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
3110: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
3120: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3130: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
3140: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  nt record */.  i
3150: 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20 20  nt nPop         
3160: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
3170: 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63 6b  mes to pop stack
3180: 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f   when jumping */
3190: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66  .){.  if( p->iOf
31a0: 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74  fset>=0 && iCont
31b0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
31c0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
31d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
31e0: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c   OP_MemIncr, -1,
31f0: 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
3200: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
3220: 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f 66  IfMemNeg, p->iOf
3230: 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  fset, 0);.    if
3240: 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20  ( nPop>0 ){.    
3250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3260: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50  Op(v, OP_Pop, nP
3270: 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  op, 0);.    }.  
3280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3290: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
32a0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
32b0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
32c0: 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45 54  , "# skip OFFSET
32d0: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20   records"));.   
32e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
32f0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
3300: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
3310: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
3320: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
3330: 65 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  e the top N elem
3340: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73  ents of the.** s
3350: 74 61 63 6b 20 61 72 65 20 64 69 73 74 69 6e 63  tack are distinc
3360: 74 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  t.  iTab is a so
3370: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3380: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3390: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
33a0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
33b0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
33c0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
33d0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
33e0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
33f0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3400: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
3410: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
3420: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
3430: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
3440: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
3450: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
3460: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
3470: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3480: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
3490: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
34a0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
34b0: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
34c0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61   VM */.  int iTa
34d0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
34e0: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75   sorting index u
34f0: 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  sed to test for 
3500: 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a  distinctness */.
3510: 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74    int addrRepeat
3520: 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ,    /* Jump to 
3530: 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74  here if not dist
3540: 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 20  inct */.  int N 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3560: 54 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  The top N elemen
3570: 74 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20  ts of the stack 
3580: 6d 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 74  must be distinct
3590: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
35a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
35b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20  MakeRecord, -N, 
35c0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
35d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73  eAddOp(v, OP_Dis
35e0: 74 69 6e 63 74 2c 20 69 54 61 62 2c 20 73 71 6c  tinct, iTab, sql
35f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
3600: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c  ddr(v)+3);.  sql
3610: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3620: 20 4f 50 5f 50 6f 70 2c 20 4e 2b 31 2c 20 30 29   OP_Pop, N+1, 0)
3630: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3640: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
3650: 20 30 2c 20 61 64 64 72 52 65 70 65 61 74 29 3b   0, addrRepeat);
3660: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
3670: 76 2c 20 22 23 20 73 6b 69 70 20 69 6e 64 69 73  v, "# skip indis
3680: 74 69 6e 63 74 20 72 65 63 6f 72 64 73 22 29 29  tinct records"))
3690: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
36a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
36b0: 73 65 72 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a  sert, iTab, 0);.
36c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
36d0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
36e0: 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  ge when a SELECT
36f0: 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
3700: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  a subexpression.
3710: 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61  ** (example:  "a
3720: 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52   IN (SELECT * FR
3730: 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20  OM table)") but 
3740: 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  it has more than
3750: 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c   1 result.** col
3760: 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73  umn.  We do this
3770: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
3780: 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72   because the err
3790: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c  or occurs in mul
37a0: 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e  tiple.** places.
37b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
37c0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
37d0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 50 61  mnSelectError(Pa
37e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
37f0: 20 65 44 65 73 74 2c 20 69 6e 74 20 6e 45 78 70   eDest, int nExp
3800: 72 29 7b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e  r){.  if( nExpr>
3810: 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54  1 && (eDest==SRT
3820: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
3830: 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73  RT_Set) ){.    s
3840: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3850: 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
3860: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
3870: 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
3880: 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
3890: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
38a0: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
38b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c   return 1;.  }el
38c0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  se{.    return 0
38d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
38e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
38f0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
3900: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
3910: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
3920: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
3930: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
3940: 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20  and nColumn are 
3950: 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20  both zero, then 
3960: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
3970: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
3980: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
3990: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
39a0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
39b0: 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20  If nColumn>0.** 
39c0: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
39d0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
39e0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
39f0: 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74  ed only to get t
3a00: 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20  he.** datatypes 
3a10: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3a30: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
3a40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3a60: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
3a70: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a90: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
3aa0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
3ab0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
3ac0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
3ad0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3ae0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
3af0: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
3b00: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
3b10: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
3b20: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
3b30: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
3b40: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
3b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
3b60: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
3b70: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
3b80: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
3b90: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
3ba0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
3bb0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
3bc0: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
3bd0: 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
3be0: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
3bf0: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
3c00: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
3c10: 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
3c20: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
3c30: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
3c40: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
3c50: 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20  iParm,          
3c60: 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75 6d 65      /* An argume
3c70: 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70 6f 73  nt to the dispos
3c80: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
3c90: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
3ca0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
3cb0: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
3cc0: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
3cd0: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c 20 20  .  int iBreak,  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
3cf0: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
3d00: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
3d10: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72  r loop */.  char
3d20: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
3d30: 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74 79 20      /* affinity 
3d40: 73 74 72 69 6e 67 20 69 66 20 65 44 65 73 74 20  string if eDest 
3d50: 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a  is SRT_Union */.
3d60: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
3d70: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3d80: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
3d90: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
3da0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
3db0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
3dc0: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a   is present */..
3dd0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
3de0: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
3df0: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
3e00: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
3e10: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
3e20: 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  on the SELECT st
3e30: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 64 6f  atement, then do
3e40: 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a 2a 20   the check.  ** 
3e50: 74 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 72  to see if this r
3e60: 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f 75 74  ow should be out
3e70: 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61 73 44  put..  */.  hasD
3e80: 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e  istinct = distin
3e90: 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73 74 2d  ct>=0 && pEList-
3ea0: 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66 28 20  >nExpr>0;.  if( 
3eb0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
3ec0: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
3ed0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
3ee0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 30   p, iContinue, 0
3ef0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
3f00: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
3f10: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
3f20: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
3f30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3f40: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
3f50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3f60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
3f70: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29 3b 0a  mn, srcTab, i);.
3f80: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3f90: 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 45 4c     nColumn = pEL
3fa0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
3fb0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
3fc0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
3fd0: 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
3fe0: 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e  /* If the DISTIN
3ff0: 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70  CT keyword was p
4000: 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45  resent on the SE
4010: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
4020: 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77   ** and this row
4030: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62   has been seen b
4040: 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e  efore, then do n
4050: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77  ot make this row
4060: 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  .  ** part of th
4070: 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
4080: 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74   if( hasDistinct
4090: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
40a0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
40b0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
40c0: 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20  >nExpr==nColumn 
40d0: 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69  );.    codeDisti
40e0: 6e 63 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c  nct(v, distinct,
40f0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
4100: 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  umn);.    if( pO
4110: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4120: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4130: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e   p, iContinue, n
4140: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20  Column);.    }. 
4150: 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46   }..  if( checkF
4160: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
4170: 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
4180: 20 65 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   eDest, pEList->
4190: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65  nExpr) ){.    re
41a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 73  turn 0;.  }..  s
41b0: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
41c0: 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d      /* In this m
41d0: 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20  ode, write each 
41e0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20  query result to 
41f0: 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74  the key of the t
4200: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20  emporary.    ** 
4210: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
4220: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4230: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
4240: 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65  _SELECT.    case
4250: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
4260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4270: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
4280: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
4290: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66  0);.      if( af
42a0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
42b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
42c0: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
42d0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
42e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
42f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
4300: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
4310: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4330: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
4340: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
4350: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
4360: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
4370: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
4380: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
4390: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
43a0: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
43b0: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
43c0: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
43d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
43e0: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
43f0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
4400: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
4410: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4420: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
4430: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  mn, 0);.      sq
4440: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4450: 33 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33  3(v, -1, aff, P3
4460: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
4470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4480: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
4490: 20 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b   iParm, addr+3);
44a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
44b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65  beAddOp(v, OP_De
44c0: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b  lete, iParm, 0);
44d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
44e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
44f0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
4500: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
4510: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
4520: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4530: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
4540: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
4550: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4560: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4570: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f  _MakeRecord, nCo
4580: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4590: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
45a0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
45b0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
45c0: 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20  OrderBy, p);.   
45d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
45e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
45f0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
4600: 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  d, iParm, 0);.  
4610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4620: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
4630: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
4640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4650: 4f 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  Op(v, OP_Insert,
4660: 20 69 50 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41   iParm, OPFLAG_A
4670: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 7d 0a  PPEND);.      }.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
46a0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
46b0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
46c0: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
46d0: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
46e0: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
46f0: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
4700: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
4710: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
4720: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
4730: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
4740: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
4750: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
4760: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
4770: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4780: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
4790: 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  nt addr1 = sqlit
47a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
47b0: 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  r(v);.      int 
47c0: 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73  addr2;..      as
47d0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
47e0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
47f0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4800: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
4810: 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  dr1+3);.      sq
4820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4830: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
4840: 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73  .      addr2 = s
4850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4860: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
4870: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
4880: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f  nity = sqlite3Co
4890: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
48a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
48b0: 2c 28 69 50 61 72 6d 3e 3e 31 36 29 26 30 78 66  ,(iParm>>16)&0xf
48c0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  f);.      if( pO
48d0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
48e0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
48f0: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
4900: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
4910: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
4920: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
4930: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
4940: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
4950: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4960: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
4970: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
4980: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
4990: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
49a0: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
49b0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
49c0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
49d0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
49e0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
49f0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4a00: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4a10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a20: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
4a30: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
4a40: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
4a50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4a60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4a70: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50  P_IdxInsert, (iP
4a80: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
4a90: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4aa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4ab0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
4ac0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4ad0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4ae0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
4af0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
4b00: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
4b10: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
4b20: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4b30: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
4b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b50: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
4b60: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
4b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4b80: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4b90: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4ba0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
4bb0: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
4bc0: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
4bd0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
4be0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4bf0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
4c00: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
4c10: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
4c20: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
4c30: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
4c40: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
4c50: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
4c60: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
4c70: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4c80: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
4c90: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4ca0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
4cb0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4cc0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
4cd0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4ce0: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4cf0: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4d00: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
4d10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4d20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4d30: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4d40: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4d50: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
4d60: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
4d70: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4d80: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
4d90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4da0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
4db0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4dc0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
4dd0: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
4de0: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
4df0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
4e00: 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
4e10: 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
4e20: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
4e30: 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
4e40: 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
4e50: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
4e60: 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
4e70: 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
4e80: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
4e90: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
4ea0: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
4eb0: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b   SRT_Callback: {
4ec0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4ed0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4ef0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4f00: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4f10: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4f20: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4f30: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4f40: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
4f50: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
4f60: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
4f70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4f80: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
4f90: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
4fa0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4fb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4fc0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4fd0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ff0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5000: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5010: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5020: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5030: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5040: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5050: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5060: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
5070: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
5080: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
5090: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
50a0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
50b0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
50c0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
50d0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
50e0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
50f0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5100: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5110: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5120: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5130: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5140: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5160: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5170: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
5180: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5190: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
51a0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
51b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
51c0: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
51d0: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
51e0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
51f0: 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
5200: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5210: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5220: 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e  MemIncr, -1, p->
5230: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
5240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5250: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
5260: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
5270: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5280: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
5290: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
52a0: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
52b0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
52c0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
52d0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
52e0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
52f0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
5300: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
5310: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
5320: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
5330: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
5340: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
5350: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
5360: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
5370: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
5380: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
5390: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
53a0: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
53b0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
53c0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
53d0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
53e0: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
53f0: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
5400: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5410: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
5420: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
5430: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
5440: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
5450: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
5460: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
5470: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
5480: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
5490: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
54a0: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
54b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
54c0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
54d0: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
54e0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
54f0: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
5500: 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e  .  Add the KeyIn
5510: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
5520: 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20  the P3 field of 
5530: 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a  an opcode using.
5540: 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  ** P3_KEYINFO_HA
5550: 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75  NDOFF is the usu
5560: 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e  al way of dealin
5570: 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a  g with this..*/.
5580: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
5590: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
55a0: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
55b0: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
55c0: 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  st){.  sqlite3 *
55d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
55e0: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
55f0: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
5600: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
5610: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
5620: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
5630: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
5640: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
5650: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
5660: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
5670: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
5680: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
5690: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
56a0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
56b0: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
56c0: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
56d0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45  nfo->nField = nE
56e0: 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  xpr;.    pInfo->
56f0: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
5700: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
5710: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
5720: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
5730: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
5740: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
5750: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
5760: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
5770: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
5780: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
5790: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
57a0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
57b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
57c0: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
57d0: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
57e0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
57f0: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
5800: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
5810: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
5820: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
5830: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5840: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
5850: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
5860: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
5870: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
5880: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
5890: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
58a0: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
58b0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
58c0: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
58d0: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
58e0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
58f0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
5900: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
5910: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
5920: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
5930: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5940: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
5950: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
5960: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
5970: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
5980: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
5990: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
59a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
59b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a  e *v,         /*
59c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
59d0: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
59e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
59f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5a00: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
5a10: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
5a20: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5a30: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
5a40: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
5a50: 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a   iParm        /*
5a60: 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65   Optional parame
5a70: 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ter associated w
5a80: 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a  ith eDest */.){.
5a90: 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69    int brk = sqli
5aa0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
5ab0: 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20  (v);.  int cont 
5ac0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5ad0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
5ae0: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
5af0: 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54  b;.  int pseudoT
5b00: 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  ab = 0;.  ExprLi
5b10: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
5b20: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69  ->pOrderBy;..  i
5b30: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
5b40: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
5b50: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
5b60: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
5b70: 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a  T_Subroutine ){.
5b80: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
5b90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
5ba0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5bb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  ddOp(v, OP_OpenP
5bc0: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
5bd0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
5be0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
5bf0: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
5c00: 70 73 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c 75  pseudoTab, nColu
5c10: 6d 6e 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  mn);.  }.  addr 
5c20: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
5c30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72  eAddOp(v, OP_Sor
5c40: 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20  t, iTab, brk);. 
5c50: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
5c60: 2c 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 69 66  , cont, 0);.  if
5c70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c  ( eDest==SRT_Cal
5c80: 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d  lback || eDest==
5c90: 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29  SRT_Subroutine )
5ca0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
5cb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
5cc0: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  eger, 1, 0);.  }
5cd0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5ce0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
5cf0: 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79  , iTab, pOrderBy
5d00: 2d 3e 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20 20  ->nExpr + 1);.  
5d10: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
5d20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
5d30: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
5d40: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
5d50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5d60: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  ddOp(v, OP_NewRo
5d70: 77 69 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  wid, iParm, 0);.
5d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d90: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
5da0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
5db0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5dc0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
5dd0: 50 61 72 6d 2c 20 4f 50 46 4c 41 47 5f 41 50 50  Parm, OPFLAG_APP
5de0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
5df0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
5e00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5e10: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
5e20: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5e30: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5e40: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
5e50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5e60: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
5e70: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5e80: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
5e90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ea0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
5eb0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
5ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5ed0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
5ee0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5ef0: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
5f00: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
5f10: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5f20: 2c 20 31 2c 20 30 2c 20 26 70 2d 3e 61 66 66 69  , 1, 0, &p->affi
5f30: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
5f40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f50: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
5f60: 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46  , (iParm&0x0000F
5f70: 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  FFF), 0);.      
5f80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5f90: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
5fa0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
5fb0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
5fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fd0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
5fe0: 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  re, iParm, 1);. 
5ff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
6000: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
6010: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
6020: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
6030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6040: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52  ndif.    case SR
6050: 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20  T_Callback:.    
6060: 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74  case SRT_Subrout
6070: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
6080: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
6090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
60a0: 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54  _Insert, pseudoT
60b0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  ab, 0);.      fo
60c0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
60d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
60e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
60f0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
6100: 73 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20 20  seudoTab, i);.  
6110: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6120: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6130: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ack ){.        s
6140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6150: 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20  v, OP_Callback, 
6160: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  nColumn, 0);.   
6170: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6190: 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
61a0: 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  0, iParm);.     
61b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
61c0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
61d0: 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  t: {.      /* Do
61e0: 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20   nothing */.    
61f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6200: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6210: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6220: 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49  loop when the LI
6230: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20  MIT is reached. 
6240: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
6250: 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mit>=0 ){.    sq
6260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6270: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
6280: 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20  , p->iLimit);.  
6290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62a0: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65  Op(v, OP_IfMemZe
62b0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62  ro, p->iLimit, b
62c0: 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  rk);.  }..  /* T
62d0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
62e0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
62f0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6300: 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20  abel(v, cont);. 
6310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6320: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  p(v, OP_Next, iT
6330: 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c  ab, addr);.  sql
6340: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
6350: 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20  abel(v, brk);.  
6360: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6370: 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74  allback || eDest
6380: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
6390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
63a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
63b0: 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c  lose, pseudoTab,
63c0: 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a   0);.  }..}../*.
63d0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
63e0: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
63f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
6400: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
6410: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
6420: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
6430: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
6440: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
6450: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
6460: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  .**.** The decla
6470: 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74  ration type is t
6480: 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70  he exact datatyp
6490: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74  e definition ext
64a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  racted from the.
64b0: 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41  ** original CREA
64c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
64d0: 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  nt if the expres
64e0: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
64f0: 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61  . The.** declara
6500: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20  tion type for a 
6510: 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49  ROWID field is I
6520: 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20  NTEGER. Exactly 
6530: 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  when an expressi
6540: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  on.** is conside
6550: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e  red a column can
6560: 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74   be complex in t
6570: 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73  he presence of s
6580: 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a  ubqueries. The.*
6590: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
65a0: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f  ression in all o
65b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
65c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
65d0: 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65  s is .** conside
65e0: 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20  red a column by 
65f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
6600: 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f  *.**   SELECT co
6610: 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20  l FROM tbl;.**  
6620: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
6630: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
6640: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
6650: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b  T col FROM tbl);
6660: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63  .**   SELECT abc
6670: 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f   FROM (SELECT co
6680: 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62  l AS abc FROM tb
6690: 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64  l);.** .** The d
66a0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
66b0: 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69  for any expressi
66c0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  on other than a 
66d0: 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a  column is NULL..
66e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
66f0: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
6700: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
6710: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
6720: 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Expr,.  const ch
6730: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c  ar **pzOriginDb,
6740: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
6750: 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63  pzOriginTab,.  c
6760: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
6770: 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61  iginCol.){.  cha
6780: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
6790: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
67a0: 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b   *zOriginDb = 0;
67b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
67c0: 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20  OriginTab = 0;. 
67d0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
67e0: 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  iginCol = 0;.  i
67f0: 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70  nt j;.  if( pExp
6800: 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  r==0 || pNC->pSr
6810: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
6820: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54  n 0;..  /* The T
6830: 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63 61  K_AS operator ca
6840: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20  n only occur in 
6850: 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50 20  ORDER BY, GROUP 
6860: 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a  BY, HAVING,.  **
6870: 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73   and LIMIT claus
6880: 65 73 2e 20 20 42 75 74 20 70 45 78 70 72 20 6f  es.  But pExpr o
6890: 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65  riginates in the
68a0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
68b0: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53  .  ** SELECT.  S
68c0: 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65 76 65  o pExpr can neve
68d0: 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20  r contain an AS 
68e0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20  operator..  */. 
68f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
6900: 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20  op!=TK_AS );..  
6910: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
6920: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
6930: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
6940: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
6950: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
6960: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6970: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
6980: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
6990: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
69a0: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
69b0: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
69c0: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
69d0: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
69e0: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
69f0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
6a00: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
6a10: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
6a20: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
6a30: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
6a40: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
6a50: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
6a60: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
6a70: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
6a80: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
6a90: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
6aa0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
6ab0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
6ac0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
6ad0: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
6ae0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
6af0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  /.      while( p
6b00: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
6b10: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
6b20: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
6b30: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
6b40: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
6b50: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
6b60: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
6b70: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
6b80: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
6b90: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
6ba0: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
6bb0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
6bc0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
6bd0: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
6be0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
6bf0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
6c00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6c10: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
6c20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6c30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
6c40: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
6c50: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20    /* FIX ME:.   
6c60: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e       ** This can
6c70: 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68   occurs if you h
6c80: 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69  ave something li
6c90: 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  ke "SELECT new.x
6ca0: 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20  ;" inside.      
6cb0: 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20    ** a trigger. 
6cc0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
6cd0: 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63   if you referenc
6ce0: 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e  e the special "n
6cf0: 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ew".        ** t
6d00: 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75  able in the resu
6d10: 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65  lt set of a sele
6d20: 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68  ct.  We do not h
6d30: 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20  ave a good way. 
6d40: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e         ** to fin
6d50: 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62  d the actual tab
6d60: 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c  le type, so call
6d70: 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69   it "TEXT".  Thi
6d80: 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20  s is really.    
6d90: 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67      ** something
6da0: 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49   of a bug, but I
6db0: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77   do not know how
6dc0: 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20   to fix it..    
6dd0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
6de0: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73  * This code does
6df0: 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65   not produce the
6e00: 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
6e10: 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e  - it just preven
6e20: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ts.        ** a 
6e30: 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74  segfault.  See t
6e40: 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20  icket #1229..   
6e50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
6e60: 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a  zType = "TEXT";.
6e70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6e80: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
6e90: 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20  sert( pTab );.  
6ea0: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
6eb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
6ec0: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
6ed0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
6ee0: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
6ef0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
6f00: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
6f10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
6f20: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
6f30: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
6f40: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
6f50: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
6f60: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
6f70: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
6f80: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
6f90: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
6fa0: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
6fb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
6fd0: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
6fe0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
6ff0: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
7000: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
7010: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
7020: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
7030: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
7040: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
7050: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
7060: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
7070: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
7080: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
7090: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
70a0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
70b0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
70c0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
70d0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
70e0: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
70f0: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
7100: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
7110: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
7120: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
7130: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
7140: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
7150: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63         zType = c
7160: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
7170: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
7180: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
7190: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
71a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
71b0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
71c0: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
71d0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
71e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
71f0: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
7200: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
7210: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
7220: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7230: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
7240: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
7250: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
7260: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
7270: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
7280: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
7290: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69            zOrigi
72a0: 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  nCol = "rowid";.
72b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
72c0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
72d0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
72e0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
72f0: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7300: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7310: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
7320: 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69  }.        zOrigi
7330: 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  nTab = pTab->zNa
7340: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
7350: 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20  pNC->pParse ){. 
7360: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
7370: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
7380: 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61  ToIndex(pNC->pPa
7390: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
73a0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
73b0: 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70     zOriginDb = p
73c0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
73d0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
73e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
73f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7400: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7410: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7420: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
7430: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
7440: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7450: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
7460: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
7470: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
7480: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
7490: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
74a0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
74b0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
74c0: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
74d0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
74e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
74f0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
7500: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
7510: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
7520: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
7530: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
7540: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
7550: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
7560: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
7570: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
7580: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
7590: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
75a0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
75b0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
75c0: 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26  p, &zOriginDb, &
75d0: 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72  zOriginTab, &zOr
75e0: 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20  iginCol); .     
75f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7600: 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ndif.  }.  .  if
7610: 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a  ( pzOriginDb ){.
7620: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
7630: 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69  iginTab && pzOri
7640: 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  ginCol );.    *p
7650: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69  zOriginDb = zOri
7660: 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  ginDb;.    *pzOr
7670: 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69  iginTab = zOrigi
7680: 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  nTab;.    *pzOri
7690: 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e  ginCol = zOrigin
76a0: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Col;.  }.  retur
76b0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
76c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
76d0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
76e0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
76f0: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
7700: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
7710: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
7720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
7730: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
7740: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
7750: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
7760: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7770: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
7780: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
7790: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
77a0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
77b0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
77c0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
77d0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
77e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
77f0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
7800: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7810: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
7820: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
7830: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
7840: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
7850: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
7860: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7870: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
7880: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
7890: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
78a0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
78b0: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
78c0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
78d0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
78e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
78f0: 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e   *zType = column
7900: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7910: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
7920: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a  b, &zOrigCol);..
7930: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
7940: 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f  must make it's o
7950: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
7960: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
7970: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
7980: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
7990: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
79a0: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
79b0: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
79c0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
79d0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
79e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
79f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
7a00: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
7a10: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
7a20: 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a   P3_TRANSIENT);.
7a30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7a40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7a50: 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45  COLNAME_DATABASE
7a60: 2c 20 7a 4f 72 69 67 44 62 2c 20 50 33 5f 54 52  , zOrigDb, P3_TR
7a70: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
7a80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7a90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
7aa0: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
7ab0: 62 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29  b, P3_TRANSIENT)
7ac0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7ad0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7ae0: 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e  , COLNAME_COLUMN
7af0: 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 33 5f 54  , zOrigCol, P3_T
7b00: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
7b10: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
7b20: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7b30: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
7b40: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
7b50: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
7b60: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
7b70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
7b80: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
7b90: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
7ba0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
7bb0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
7bc0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
7bd0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
7be0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
7bf0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
7c00: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
7c10: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
7c20: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
7c30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
7c40: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
7c50: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
7c60: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
7c70: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
7c80: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
7c90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
7ca0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
7cb0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
7cc0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
7cd0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7ce0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
7cf0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
7d00: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
7d10: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
7d20: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
7d30: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
7d40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7d50: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
7d60: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
7d70: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
7d80: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
7d90: 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74  ocFailed() ) ret
7da0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
7db0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
7dc0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
7dd0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7de0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
7df0: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
7e00: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
7e10: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
7e20: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
7e30: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
7e40: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
7e50: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
7e60: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
7e70: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
7e80: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
7e90: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
7ea0: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63      if( p==0 ) c
7eb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
7ec0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
7ed0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
7ee0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
7ef0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
7f00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f10: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7f20: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
7f30: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
7f40: 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74  me));.      cont
7f50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
7f60: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
7f70: 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74  LUMN && pTabList
7f80: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
7f90: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
7fa0: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
7fb0: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
7fc0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
7fd0: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
7fe0: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
7ff0: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
8000: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
8010: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
8020: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8030: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
8040: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
8050: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
8060: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
8070: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
8080: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
8090: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
80a0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
80b0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
80c0: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
80d0: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
80e0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
80f0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8100: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8110: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
8120: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
8130: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
8140: 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  mes && p->span.z
8150: 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d   && p->span.z[0]
8160: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8170: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8180: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8190: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
81a0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
81b0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
81c0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
81d0: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
81e0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
81f0: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
8200: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8210: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8220: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
8230: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
8240: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
8250: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
8260: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
8270: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
8280: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8290: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
82a0: 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  e, zTab, ".", zC
82b0: 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ol, (char*)0);. 
82c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
82d0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
82e0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
82f0: 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d   zName, P3_DYNAM
8300: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8310: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8320: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8330: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8340: 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e  ME, zCol, strlen
8350: 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d  (zCol));.      }
8360: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8370: 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73  ->span.z && p->s
8380: 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  pan.z[0] ){.    
8390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
83a0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
83b0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61  LNAME_NAME, (cha
83c0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
83d0: 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  >span.n);.      
83e0: 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  /* sqlite3VdbeCo
83f0: 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61  mpressSpace(v, a
8400: 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c  ddr); */.    }el
8410: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  se{.      char z
8420: 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20  Name[30];.      
8430: 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54  assert( p->op!=T
8440: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62  K_COLUMN || pTab
8450: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
8460: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8470: 66 28 73 69 7a 65 6f 66 28 7a 4e 61 6d 65 29 2c  f(sizeof(zName),
8480: 20 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75 6d 6e 25   zName, "column%
8490: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  d", i+1);.      
84a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
84b0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
84c0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
84d0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
84e0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
84f0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8500: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8510: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8520: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8530: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
8540: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
8550: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
8560: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
8570: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
8580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
8590: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
85a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
85b0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
85c0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
85d0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
85e0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
85f0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
8600: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
8610: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
8620: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
8630: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
8640: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
8650: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
8660: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
8670: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
8680: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8690: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
86a0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
86b0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
86c0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
86d0: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
86e0: 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74  c int prepSelect
86f0: 53 74 6d 74 28 50 61 72 73 65 2a 2c 20 53 65 6c  Stmt(Parse*, Sel
8700: 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  ect*);../*.** Gi
8710: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
8720: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
8730: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
8740: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
8750: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
8760: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
8770: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
8780: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
8790: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
87a0: 61 72 73 65 2c 20 63 68 61 72 20 2a 7a 54 61 62  arse, char *zTab
87b0: 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  Name, Select *pS
87c0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
87d0: 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  *pTab;.  int i, 
87e0: 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  j;.  ExprList *p
87f0: 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  EList;.  Column 
8800: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 0a 20  *aCol, *pCol;.. 
8810: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
8820: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
8830: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
8840: 69 6f 72 3b 0a 20 20 69 66 28 20 70 72 65 70 53  ior;.  if( prepS
8850: 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
8860: 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
8870: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
8880: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
8890: 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
88a0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 20 29  e, pSelect, 0) )
88b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
88c0: 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 73 71 6c    }.  pTab = sql
88d0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
88e0: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
88f0: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
8900: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8910: 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
8920: 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
8930: 20 7a 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69   zTabName ? sqli
8940: 74 65 53 74 72 44 75 70 28 7a 54 61 62 4e 61 6d  teStrDup(zTabNam
8950: 65 29 20 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74  e) : 0;.  pEList
8960: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
8970: 73 74 3b 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c  st;.  pTab->nCol
8980: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
8990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
89a0: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54  ->nCol>0 );.  pT
89b0: 61 62 2d 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20  ab->aCol = aCol 
89c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
89d0: 73 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f  sizeof(pTab->aCo
89e0: 6c 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c  l[0])*pTab->nCol
89f0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   );.  for(i=0, p
8a00: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62  Col=aCol; i<pTab
8a10: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
8a20: 6c 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  l++){.    Expr *
8a30: 70 2c 20 2a 70 52 3b 0a 20 20 20 20 63 68 61 72  p, *pR;.    char
8a40: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
8a50: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
8a60: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
8a70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
8a80: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
8a90: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8aa0: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
8ab0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
8ac0: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
8ad0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
8ae0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
8af0: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
8b00: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
8b10: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
8b20: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
8b30: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
8b40: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
8b50: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
8b60: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
8b70: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8b80: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
8b90: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
8ba0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
8bb0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
8bc0: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
8bd0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61  sqliteStrDup(zNa
8be0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  me);.    }else i
8bf0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  f( p->op==TK_DOT
8c00: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8c10: 26 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74  && (pR=p->pRight
8c20: 29 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65  )!=0 && pR->toke
8c30: 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  n.z && pR->token
8c40: 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f  .z[0] ){.      /
8c50: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66  * For columns of
8c60: 20 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73   the from A.B us
8c70: 65 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20  e B as the name 
8c80: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
8c90: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8ca0: 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e  "%T", &pR->token
8cb0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8cc0: 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d   p->span.z && p-
8cd0: 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20  >span.z[0] ){.  
8ce0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
8cf0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
8d00: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
8d10: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
8d20: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8d30: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8d40: 66 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e  f("%T", &p->span
8d50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8d60: 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c      /* If all el
8d70: 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75  se fails, make u
8d80: 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  p a name */.    
8d90: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8da0: 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e  3MPrintf("column
8db0: 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d  %d", i+1);.    }
8dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
8dd0: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
8de0: 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
8df0: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
8e00: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e     sqliteFree(zN
8e10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
8e20: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
8e30: 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Tab);.      retu
8e40: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
8e50: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
8e60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
8e70: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
8e80: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
8e90: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
8ea0: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
8eb0: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
8ec0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
8ed0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
8ee0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e  Name = strlen(zN
8ef0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
8f00: 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  cnt=0; j<i; j++)
8f10: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
8f20: 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b  te3StrICmp(aCol[
8f30: 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  j].zName, zName)
8f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
8f50: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
8f60: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
8f70: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8f80: 22 25 7a 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%z:%d", zName, 
8f90: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
8fa0: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
8fb0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
8fc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8fd0: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
8fe0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20  ame = zName;..  
8ff0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 74 79 70    /* Get the typ
9000: 65 6e 61 6d 65 2c 20 74 79 70 65 20 61 66 66 69  ename, type affi
9010: 6e 69 74 79 2c 20 61 6e 64 20 63 6f 6c 6c 61 74  nity, and collat
9020: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
9030: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 75   the.    ** colu
9040: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  mn..    */.    m
9050: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
9060: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
9070: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
9080: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
9090: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
90a0: 65 53 74 72 44 75 70 28 63 6f 6c 75 6d 6e 54 79  eStrDup(columnTy
90b0: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
90c0: 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  , 0));.    pCol-
90d0: 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a  >zType = zType;.
90e0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
90f0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
9100: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
9110: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9120: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
9130: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
9140: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
9150: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
9160: 69 74 65 53 74 72 44 75 70 28 70 43 6f 6c 6c 2d  iteStrDup(pColl-
9170: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
9180: 20 7d 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79   }.  pTab->iPKey
9190: 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
91a0: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  pTab;.}../*.** P
91b0: 72 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20  repare a SELECT 
91c0: 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
91d0: 6f 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e  ocessing by doin
91e0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  g the following.
91f0: 2a 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a  ** things:.**.**
9200: 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
9210: 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
9220: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
9230: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
9240: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
9250: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
9260: 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
9270: 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
9280: 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
9290: 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
92a0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
92b0: 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
92c0: 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
92d0: 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
92e0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
92f0: 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
9300: 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
9310: 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
9320: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
9330: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9340: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
9350: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
9360: 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
9370: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
9380: 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
9390: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
93a0: 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
93b0: 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
93c0: 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
93d0: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
93e0: 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
93f0: 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
9400: 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
9410: 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
9420: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
9430: 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
9440: 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
9450: 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
9460: 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
9470: 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
9480: 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
9490: 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
94a0: 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
94b0: 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
94c0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
94d0: 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
94e0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
94f0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
9500: 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
9510: 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
9520: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
9530: 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
9540: 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
9550: 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
9560: 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
9570: 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
9580: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
9590: 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
95a0: 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
95b0: 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
95c0: 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
95d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
95e0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
95f0: 65 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73  ere are problems
9600: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
9610: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
9620: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
9630: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
9640: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
9650: 65 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70  ectStmt(Parse *p
9660: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
9670: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
9680: 2c 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20  , rc;.  SrcList 
9690: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
96a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
96b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
96c0: 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
96d0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70  if( p==0 || p->p
96e0: 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Src==0 || sqlite
96f0: 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20  3MallocFailed() 
9700: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
9710: 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20  .  }.  pTabList 
9720: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
9730: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
9740: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
9750: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
9760: 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
9770: 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
9780: 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
9790: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
97a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
97b0: 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
97c0: 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
97d0: 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d  rsors(pParse, p-
97e0: 3e 70 53 72 63 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  >pSrc);..  /* Lo
97f0: 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
9800: 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
9810: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
9820: 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
9830: 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
9840: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
9850: 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
9860: 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
9870: 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
9880: 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
9890: 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
98a0: 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
98b0: 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
98c0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
98d0: 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
98e0: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
98f0: 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
9900: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
9910: 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
9920: 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
9930: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
9940: 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
9950: 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
9960: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
9970: 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
9980: 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
9990: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
99a0: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
99b0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
99c0: 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d  f( pFrom->zName=
99d0: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
99e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
99f0: 52 59 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  RY.      /* A su
9a00: 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
9a10: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
9a20: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
9a30: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9a40: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
9a50: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41     if( pFrom->zA
9a60: 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lias==0 ){.     
9a70: 20 20 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73     pFrom->zAlias
9a80: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
9a90: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 73 71 6c  ite3MPrintf("sql
9aa0: 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
9ab0: 22 2c 20 28 76 6f 69 64 2a 29 70 46 72 6f 6d 2d  ", (void*)pFrom-
9ac0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
9ad0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9ae0: 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
9af0: 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
9b00: 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20  pTab = pTab = . 
9b10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
9b20: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
9b30: 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 2d 3e 7a  pParse, pFrom->z
9b40: 41 6c 69 61 73 2c 20 70 46 72 6f 6d 2d 3e 70 53  Alias, pFrom->pS
9b50: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
9b60: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
9b70: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
9b90: 54 68 65 20 69 73 45 70 68 65 6d 20 66 6c 61 67  The isEphem flag
9ba0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
9bb0: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
9bc0: 75 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20  ure has been.   
9bd0: 20 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c     ** dynamicall
9be0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
9bf0: 6d 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20  may be freed at 
9c00: 61 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74  any time.  In ot
9c10: 68 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20  her words,.     
9c20: 20 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20   ** pTab is not 
9c30: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65  pointing to a pe
9c40: 72 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73  rsistent table s
9c50: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
9c60: 66 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70  fines.      ** p
9c70: 61 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d  art of the schem
9c80: 61 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62  a. */.      pTab
9c90: 2d 3e 69 73 45 70 68 65 6d 20 3d 20 31 3b 0a 23  ->isEphem = 1;.#
9ca0: 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
9cb0: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
9cc0: 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
9cd0: 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
9ce0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
9cf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
9d00: 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
9d10: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
9d20: 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20   = pTab = .     
9d30: 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
9d40: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 70 46 72  Table(pParse,pFr
9d50: 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d  om->zName,pFrom-
9d60: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
9d70: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
9d80: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
9d90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9da0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
9db0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9dc0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
9dd0: 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
9de0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9df0: 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
9e00: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
9e10: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
9e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
9e30: 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
9e40: 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
9e50: 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
9e60: 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
9e70: 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
9e80: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
9e90: 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
9ea0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9eb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9ec0: 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e     /* If pFrom->
9ed0: 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65  pSelect!=0 it me
9ee0: 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
9ef0: 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20  ng with a.      
9f00: 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e    ** view within
9f10: 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45   a view.  The SE
9f20: 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68  LECT structure h
9f30: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
9f40: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
9f50: 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76  d by the outer v
9f60: 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b  iew so we can sk
9f70: 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70  ip the copy step
9f80: 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   here.        **
9f90: 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69   in the inner vi
9fa0: 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
9fb0: 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d         if( pFrom
9fc0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
9fd0: 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d            pFrom-
9fe0: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
9ff0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 54 61 62  e3SelectDup(pTab
a000: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
a010: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
a020: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
a030: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
a040: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
a050: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
a060: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
a070: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
a080: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
a090: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
a0a0: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
a0b0: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
a0c0: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
a0d0: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
a0e0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
a0f0: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
a100: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
a110: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
a120: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
a130: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
a140: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
a150: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
a160: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
a170: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
a180: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
a190: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
a1a0: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
a1b0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
a1c0: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
a1d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
a1e0: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
a1f0: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
a200: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
a210: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
a220: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
a230: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
a240: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
a250: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
a260: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
a270: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
a280: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
a290: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
a2a0: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
a2b0: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
a2c0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
a2d0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
a2e0: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
a2f0: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
a300: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
a310: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
a320: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
a330: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
a340: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
a350: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
a360: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
a370: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
a380: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
a390: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
a3a0: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
a3b0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
a3c0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
a3d0: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
a3e0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
a3f0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
a400: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
a410: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
a420: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
a430: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
a440: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
a450: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
a460: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
a470: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
a480: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
a490: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
a4a0: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
a4b0: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
a4c0: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
a4d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
a4e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
a4f0: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
a500: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
a510: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
a520: 6d 65 73 29 21 3d 30 20 26 26 0a 20 20 20 20 20  mes)!=0 &&.     
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
a550: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
a560: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
a570: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
a580: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
a590: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
a5a0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
a5b0: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
a5c0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
a5d0: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
a5e0: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
a5f0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
a600: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
a610: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
a620: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
a630: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
a640: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
a650: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a660: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
a670: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a680: 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
a690: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
a6a0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a6b0: 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
a6c0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
a6d0: 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
a6e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a6f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
a700: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a710: 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
a720: 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a  ;.        a[k].z
a730: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
a740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
a750: 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
a760: 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
a770: 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
a780: 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
a790: 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
a7a0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
a7b0: 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
a7c0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
a7d0: 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
a7e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
a7f0: 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
a800: 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
a810: 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
a820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
a830: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70  >op==TK_DOT && p
a840: 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  E->pLeft ){.    
a850: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73        zTName = s
a860: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
a870: 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66 74 2d 3e  ken(&pE->pLeft->
a880: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
a890: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a8a0: 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   zTName = 0;.   
a8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
a8c0: 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
a8d0: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
a8e0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
a8f0: 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
a900: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
a910: 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
a920: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
a930: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
a940: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
a950: 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
a960: 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65  e==0 || zTabName
a970: 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20  [0]==0 ){ .     
a980: 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
a990: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
a9a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a9b0: 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
a9c0: 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  && (zTabName==0 
a9d0: 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  || zTabName[0]==
a9e0: 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  0 || .          
a9f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
aa00: 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
aa10: 61 62 4e 61 6d 65 29 21 3d 30 29 20 29 7b 0a 20  abName)!=0) ){. 
aa20: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
aa30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
aa40: 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
aa50: 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
aa60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
aa70: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
aa80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
aa90: 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
aaa0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
aab0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
aac0: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
aad0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
aae0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
aaf0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
ab00: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
ab10: 66 74 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  ft = &pTabList->
ab20: 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  a[i-1];.        
ab30: 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 66 74        if( (pLeft
ab40: 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [1].jointype & J
ab50: 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26  T_NATURAL)!=0 &&
ab60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ab70: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49           columnI
ab80: 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62  ndex(pLeft->pTab
ab90: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abb0: 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a  * In a NATURAL j
abc0: 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f  oin, omit the jo
abd0: 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  in columns from 
abe0: 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
abf0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e       ** table on
ac00: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
ac20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
ac30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ac40: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ac50: 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65  3IdListIndex(pLe
ac60: 66 74 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e  ft[1].pUsing, zN
ac70: 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
ac80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
ac90: 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
aca0: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
acb0: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
acc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
acd0: 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
ace0: 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
acf0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
ad00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ad10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
ad20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ad30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ad40: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
ad50: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
ad60: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
ad70: 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
ad80: 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
ad90: 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
ada0: 65 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  en(&pRight->toke
adb0: 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n, zName);.     
adc0: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
add0: 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65  ame && (longName
ade0: 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
adf0: 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20  Src>1) ){.      
ae00: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
ae10: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
ae20: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  r(TK_ID, 0, 0, 0
ae30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ae40: 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
ae50: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65  Expr(TK_DOT, pLe
ae60: 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
ae80: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
ae90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
aea0: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66    setToken(&pLef
aeb0: 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
aec0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
aed0: 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
aee0: 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65  pr->span, sqlite
aef0: 33 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22  3MPrintf("%s.%s"
af00: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d  , zTabName, zNam
af10: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e));.           
af20: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
af30: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  yn = 1;.        
af40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
af50: 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.z = 0;.      
af60: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
af70: 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  oken.n = 0;.    
af80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
af90: 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a  >token.dyn = 0;.
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
afb0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
afc0: 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
afd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
afe0: 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78  Expr->span = pEx
aff0: 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  pr->token;.     
b000: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b010: 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
b020: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
b030: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
b040: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
b050: 28 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70  (pNew, pExpr, &p
b060: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
b070: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
b090: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
b0a0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
b0b0: 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d   pExpr, &pRight-
b0c0: 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  >token);.       
b0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b0e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b0f0: 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
b100: 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
b110: 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
b120: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
b130: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b140: 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
b150: 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
b160: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
b180: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b190: 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
b1a0: 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
b1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b1c0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
b1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
b1e0: 6c 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29  liteFree(zTName)
b1f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b200: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
b210: 69 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74  istDelete(pEList
b220: 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
b230: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = pNew;.  }.  i
b240: 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
b250: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
b260: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  >SQLITE_MAX_COLU
b270: 4d 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  MN ){.    sqlite
b280: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b290: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
b2a0: 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
b2b0: 74 22 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t");.    rc = SQ
b2c0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
b2d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b2e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b2f0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b300: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b310: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
b320: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
b330: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b340: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
b350: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
b360: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
b370: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b380: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
b390: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
b3a0: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
b3b0: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
b3c0: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
b3d0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
b3e0: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b3f0: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
b400: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
b410: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
b420: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
b430: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
b440: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
b450: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
b460: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b470: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
b480: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
b490: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
b4a0: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
b4b0: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
b4c0: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
b4d0: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
b4e0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
b4f0: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
b500: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
b510: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
b520: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
b530: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
b540: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b550: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
b560: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
b570: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b580: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
b590: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
b5a0: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
b5b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b5c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
b5d0: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
b5e0: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
b5f0: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
b600: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b610: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b620: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
b630: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
b640: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b660: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
b670: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
b680: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
b690: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
b6a0: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
b6b0: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
b6c0: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
b6d0: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
b6e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b6f0: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
b700: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
b710: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b720: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
b730: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
b740: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
b750: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
b760: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
b770: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
b780: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
b790: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
b7a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
b7b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
b7c0: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
b7d0: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
b7e0: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b7f0: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
b800: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
b810: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
b820: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b830: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
b840: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
b850: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
b860: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
b870: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
b880: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b890: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 45 78 70 72  *pItem;.    Expr
b8a0: 20 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d   *pE = pOrderBy-
b8b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
b8c0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
b8d0: 20 20 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c      char *zLabel
b8e0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ;..    if( pOrde
b8f0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29  rBy->a[i].done )
b900: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
b910: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
b920: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
b930: 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l) ){.      if( 
b940: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
b950: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
b960: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b970: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b980: 0a 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45  .          "ORDE
b990: 52 20 42 59 20 70 6f 73 69 74 69 6f 6e 20 25 64  R BY position %d
b9a0: 20 73 68 6f 75 6c 64 20 62 65 20 62 65 74 77 65   should be betwe
b9b0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 0a 20 20  en 1 and %d",.  
b9c0: 20 20 20 20 20 20 20 20 69 43 6f 6c 2c 20 70 45          iCol, pE
b9d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
b9e0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
b9f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ba00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
ba10: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 20 63  mustComplete ) c
ba20: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
ba30: 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Col--;.    }.   
ba40: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 28   if( iCol<0 && (
ba50: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
ba60: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
ba70: 45 2d 3e 74 6f 6b 65 6e 29 29 21 3d 30 20 29 7b  E->token))!=0 ){
ba80: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
ba90: 70 49 74 65 6d 3d 70 45 4c 69 73 74 2d 3e 61 3b  pItem=pEList->a;
baa0: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
bab0: 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
bac0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
bad0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Name;.        in
bae0: 74 20 69 73 4d 61 74 63 68 3b 0a 20 20 20 20 20  t isMatch;.     
baf0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
bb00: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
bb10: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
bb20: 53 74 72 44 75 70 28 70 49 74 65 6d 2d 3e 7a 4e  StrDup(pItem->zN
bb30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
bb40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
bb50: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
bb60: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 49 74  meFromToken(&pIt
bb70: 65 6d 2d 3e 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  em->pExpr->token
bb80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bb90: 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 7a       isMatch = z
bba0: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
bbb0: 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c  trICmp(zName, zL
bbc0: 61 62 65 6c 29 3d 3d 30 3b 0a 20 20 20 20 20 20  abel)==0;.      
bbd0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
bbe0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
bbf0: 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   isMatch ){.    
bc00: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a        iCol = j;.
bc10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bc20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bc30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46   }.      sqliteF
bc40: 72 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20  ree(zLabel);.   
bc50: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e   }.    if( iCol>
bc60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e  =0 ){.      pE->
bc70: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
bc80: 20 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d        pE->iColum
bc90: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
bca0: 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  pE->iTable = iTa
bcb0: 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69  ble;.      pE->i
bcc0: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Agg = -1;.      
bcd0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
bce0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  one = 1;.    }el
bcf0: 73 65 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c  se if( mustCompl
bd00: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ete ){.      sql
bd10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bd20: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 4f 52  rse,.        "OR
bd30: 44 45 52 20 42 59 20 74 65 72 6d 20 6e 75 6d 62  DER BY term numb
bd40: 65 72 20 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d  er %d does not m
bd50: 61 74 63 68 20 61 6e 79 20 72 65 73 75 6c 74 20  atch any result 
bd60: 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20  column", i+1);. 
bd70: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
bd80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bd90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
bda0: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
bdb0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
bdc0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
bdd0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  LECT */../*.** G
bde0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
bdf0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
be00: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
be10: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
be20: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
be30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
be40: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
be50: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
be60: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
be70: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
be80: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
be90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
bea0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
beb0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
bec0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bed0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
bee0: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
bef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
bf00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
bf10: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
bf20: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
bf30: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
bf40: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
bf50: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
bf60: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
bf70: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
bf80: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
bf90: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
bfa0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
bfb0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
bfc0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
bfd0: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
bfe0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
bff0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
c000: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
c010: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
c020: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
c030: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
c040: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
c050: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
c060: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
c070: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
c080: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
c090: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
c0a0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
c0b0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
c0c0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
c0d0: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
c0e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
c0f0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
c100: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
c110: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
c120: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
c130: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
c140: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
c150: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
c160: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
c170: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
c180: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
c190: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
c1a0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
c1b0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
c1c0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
c1d0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
c1e0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
c1f0: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
c200: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
c210: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
c220: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
c230: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
c240: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
c250: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
c260: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
c270: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
c280: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
c290: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
c2a0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
c2b0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
c2c0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
c2d0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
c2e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
c2f0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
c300: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
c310: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
c320: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
c330: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
c340: 72 31 2c 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a  r1, addr2;..  /*
c350: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
c360: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
c370: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
c380: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
c390: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
c3a0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
c3b0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
c3c0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
c3d0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
c3e0: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
c3f0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
c400: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
c410: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
c420: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
c430: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
c440: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c450: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
c460: 3d 20 32 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  = 2;.    v = sql
c470: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c480: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
c490: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
c4a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c4b0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
c4c0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
c4d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c4e0: 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b  ustBeInt, 0, 0);
c4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
c510: 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2c 20 30 29  tore, iLimit, 0)
c520: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
c530: 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54 20 63  t((v, "# LIMIT c
c540: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73  ounter"));.    s
c550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c560: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
c570: 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29   iLimit, iBreak)
c580: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
c590: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 70 2d  Offset ){.    p-
c5a0: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
c5b0: 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  et = pParse->nMe
c5c0: 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  m++;.    v = sql
c5d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c5e0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
c5f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
c600: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c610: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73  pParse, p->pOffs
c620: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
c630: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c640: 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c 20 30 29  MustBeInt, 0, 0)
c650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c660: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
c670: 53 74 6f 72 65 2c 20 69 4f 66 66 73 65 74 2c 20  Store, iOffset, 
c680: 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20  p->pLimit==0);. 
c690: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c6a0: 76 2c 20 22 23 20 4f 46 46 53 45 54 20 63 6f 75  v, "# OFFSET cou
c6b0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64  nter"));.    add
c6c0: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
c6d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65  AddOp(v, OP_IfMe
c6e0: 6d 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 30  mPos, iOffset, 0
c6f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c700: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c710: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  p, 1, 0);.    sq
c720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c730: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
c740: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c750: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c760: 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28 20  addr1);.    if( 
c770: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
c780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c790: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30  dOp(v, OP_Add, 0
c7a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
c7b0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
c7c0: 29 7b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  ){.    addr1 = s
c7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c7e0: 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
c7f0: 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20  iLimit, 0);.    
c800: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c810: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
c820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c830: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
c840: 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74  mInt, -1, iLimit
c850: 2b 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  +1);.    addr2 =
c860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c870: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
c880: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c890: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c8a0: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
c8b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c8c0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69  OP_MemStore, iLi
c8d0: 6d 69 74 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56  mit+1, 1);.    V
c8e0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c8f0: 23 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29  # LIMIT+OFFSET")
c900: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c910: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c920: 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dr2);.  }.}../*.
c930: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 76 69  ** Allocate a vi
c940: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
c950: 73 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a  se for sorting..
c960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c970: 72 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65  reateSortingInde
c980: 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
c990: 20 53 65 6c 65 63 74 20 2a 70 2c 20 45 78 70 72   Select *p, Expr
c9a0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 29 7b  List *pOrderBy){
c9b0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
c9c0: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
c9d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72  .    assert( pOr
c9e0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d  derBy->iECursor=
c9f0: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 64 65 72  =0 );.    pOrder
ca00: 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70  By->iECursor = p
ca10: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
ca20: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
ca30: 33 56 64 62 65 41 64 64 4f 70 28 70 50 61 72 73  3VdbeAddOp(pPars
ca40: 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65  e->pVdbe, OP_Ope
ca50: 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
ca80: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64  ->iECursor, pOrd
ca90: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a  erBy->nExpr+1);.
caa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
cab0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
cac0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61  = -1 );.    p->a
cad0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
cae0: 20 61 64 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69   addr;.  }.}..#i
caf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cb00: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
cb10: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
cb20: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
cb30: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
cb40: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
cb50: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
cb60: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
cb70: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
cb80: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
cb90: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
cba0: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
cbb0: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
cbc0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
cbd0: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
cbe0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
cbf0: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
cc00: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
cc10: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
cc20: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
cc30: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
cc40: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
cc50: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
cc60: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
cc70: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
cc80: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
cc90: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
cca0: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
ccb0: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
ccc0: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
ccd0: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
cce0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
ccf0: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
cd00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cd10: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
cd20: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
cd30: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
cd40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
cd50: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
cd60: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
cd70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
cd80: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
cd90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
cda0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
cdb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cdc0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
cdd0: 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CT./*.** This ro
cde0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cdf0: 74 6f 20 70 72 6f 63 65 73 73 20 61 20 71 75 65  to process a que
ce00: 72 79 20 74 68 61 74 20 69 73 20 72 65 61 6c 6c  ry that is reall
ce10: 79 20 74 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f  y the union.** o
ce20: 72 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f  r intersection o
ce30: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  f two or more se
ce40: 70 61 72 61 74 65 20 71 75 65 72 69 65 73 2e 0a  parate queries..
ce50: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
ce60: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ce70: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
ce80: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
ce90: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
cea0: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
ceb0: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
cec0: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
ced0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
cee0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
cef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
cf00: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
cf10: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
cf20: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
cf30: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
cf40: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
cf50: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
cf60: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
cf70: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
cf80: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
cf90: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
cfa0: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
cfb0: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
cfc0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
cfd0: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
cfe0: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
cff0: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
d000: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
d010: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
d020: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
d030: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
d040: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
d050: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
d060: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
d070: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
d080: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
d090: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
d0b0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
d0c0: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
d0d0: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
d0e0: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
d0f0: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
d100: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
d110: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
d120: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d130: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
d140: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
d150: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
d160: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
d170: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
d180: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
d190: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
d1a0: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
d1b0: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
d1c0: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
d1d0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
d1e0: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
d1f0: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
d200: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
d210: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
d220: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
d230: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
d240: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
d250: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
d260: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
d270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d280: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
d290: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
d2a0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65  coded */.  int e
d2b0: 44 65 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Dest,           
d2c0: 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20   /* \___  Store 
d2d0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 61 73  query results as
d2e0: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 20 20   specified */.  
d2f0: 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20  int iParm,      
d300: 20 20 20 20 20 20 2f 2a 20 2f 20 20 20 20 20 62        /* /     b
d310: 79 20 74 68 65 73 65 20 74 77 6f 20 70 61 72 61  y these two para
d320: 6d 65 74 65 72 73 2e 20 20 20 20 20 20 20 20 20  meters.         
d330: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20  */.  char *aff  
d340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
d350: 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e   eDest is SRT_Un
d360: 69 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74  ion, the affinit
d370: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
d380: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d390: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
d3a0: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
d3b0: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
d3c0: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
d3d0: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
d3e0: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
d3f0: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
d400: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
d410: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
d420: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
d430: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
d440: 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nCol;           
d450: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
d460: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
d470: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
d480: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
d490: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
d4a0: 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 70 20   BY clause on p 
d4b0: 2a 2f 0a 20 20 69 6e 74 20 61 53 65 74 50 32 5b  */.  int aSetP2[
d4c0: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  2];        /* Se
d4d0: 74 20 50 32 20 76 61 6c 75 65 20 6f 66 20 74 68  t P2 value of th
d4e0: 65 73 65 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72  ese op to number
d4f0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
d500: 20 69 6e 74 20 6e 53 65 74 50 32 20 3d 20 30 3b   int nSetP2 = 0;
d510: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d520: 20 6f 66 20 73 6c 6f 74 73 20 69 6e 20 61 53 65   of slots in aSe
d530: 74 50 32 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20  tP2[] used */.. 
d540: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
d550: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
d560: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
d570: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
d580: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
d590: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
d5a0: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
d5b0: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
d5c0: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
d5d0: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
d5e0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e   if( p==0 || p->
d5f0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
d600: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d610: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d620: 6e 64 3b 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72  nd;.  }.  pPrior
d630: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
d640: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
d650: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
d660: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
d670: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
d680: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
d690: 74 20 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  t );.  if( pPrio
d6a0: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  r->pOrderBy ){. 
d6b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d6c0: 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52  sg(pParse,"ORDER
d6d0: 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c   BY clause shoul
d6e0: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
d6f0: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
d700: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
d710: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
d720: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
d730: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
d740: 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72    }.  if( pPrior
d750: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
d760: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d770: 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c  pParse,"LIMIT cl
d780: 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65  ause should come
d790: 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65   after %s not be
d7a0: 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c  fore",.      sel
d7b0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
d7c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
d7d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d7e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
d7f0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
d800: 20 68 61 76 65 20 61 20 76 61 6c 69 64 20 71 75   have a valid qu
d810: 65 72 79 20 65 6e 67 69 6e 65 2e 20 20 49 66 20  ery engine.  If 
d820: 6e 6f 74 2c 20 63 72 65 61 74 65 20 61 20 6e 65  not, create a ne
d830: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20  w one..  */.  v 
d840: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d850: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
d860: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  v==0 ){.    rc =
d870: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
d880: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d890: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20   }..  /* Create 
d8a0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
d8b0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d8c0: 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
d8d0: 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  /.  if( eDest==S
d8e0: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
d8f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d900: 4c 69 73 74 20 29 3b 0a 20 20 20 20 61 73 73 65  List );.    asse
d910: 72 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f  rt( nSetP2<sizeo
d920: 66 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66  f(aSetP2)/sizeof
d930: 28 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20  (aSetP2[0]) );. 
d940: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
d950: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ++] = sqlite3Vdb
d960: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
d970: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72  nEphemeral, iPar
d980: 6d 2c 20 30 29 3b 0a 20 20 20 20 65 44 65 73 74  m, 0);.    eDest
d990: 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
d9a0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
d9b0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
d9c0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
d9d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
d9e0: 20 20 2a 2f 0a 20 20 70 4f 72 64 65 72 42 79 20    */.  pOrderBy 
d9f0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
da00: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
da10: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
da20: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L: {.      if( p
da30: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
da40: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
da50: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   0;.        asse
da60: 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
da70: 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  mit );.        p
da80: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
da90: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
daa0: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
dab0: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
dac0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
dad0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
dae0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 65 44 65 73  se, pPrior, eDes
daf0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
db00: 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 20  0, aff);.       
db10: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
db20: 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73          p->pOffs
db30: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
db40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
db50: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
db60: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
db70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e     }.        p->
db80: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
db90: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
dba0: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
dbb0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73          p->iOffs
dbc0: 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
dbd0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66  fset;.        if
dbe0: 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29  ( p->iLimit>=0 )
dbf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  {.          addr
dc00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
dc10: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
dc20: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
dc30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  0);.          Vd
dc40: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
dc50: 20 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c   Jump ahead if L
dc60: 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
dc70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dc80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
dc90: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
dca0: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30   eDest, iParm, 0
dcb0: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
dcc0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
dcd0: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
dce0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
dcf0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
dd00: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
dd10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
dd20: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
dd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dd50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dd60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd70: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72    }.      /* For
dd80: 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f   UNION ALL ... O
dd90: 52 44 45 52 20 42 59 20 66 61 6c 6c 20 74 68 72  RDER BY fall thr
dda0: 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65 78 74  ough to the next
ddb0: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
ddc0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
ddd0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
dde0: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
ddf0: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
de00: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
de10: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
de20: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
de30: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
de40: 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20  nt op = 0;      
de50: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
de60: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
de70: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
de80: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
de90: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
dea0: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
deb0: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
dec0: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
ded0: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
dee0: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
def0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
df00: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
df10: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
df20: 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20  nt addr;..      
df30: 70 72 69 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d  priorOp = p->op=
df40: 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61  =TK_ALL ? SRT_Ta
df50: 62 6c 65 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b  ble : SRT_Union;
df60: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
df70: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 70 4f 72  ==priorOp && pOr
df80: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e  derBy==0 && !p->
df90: 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f  pLimit && !p->pO
dfa0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
dfb0: 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
dfc0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
dfd0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
dfe0: 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
dff0: 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
e000: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
e010: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
e020: 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  iParm;.      }el
e030: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
e040: 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
e050: 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
e060: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
e070: 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
e080: 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
e090: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
e0a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
e0b0: 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
e0c0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
e0d0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
e0e0: 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43   matchOrderbyToC
e0f0: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c  olumn(pParse, p,
e100: 20 70 4f 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e   pOrderBy, union
e110: 54 61 62 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  Tab,1) ){.      
e120: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
e130: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e140: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
e160: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
e170: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
e180: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
e190: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
e1a0: 20 20 69 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53    if( priorOp==S
e1b0: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
e1c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 53        assert( nS
e1d0: 65 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74  etP2<sizeof(aSet
e1e0: 50 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50  P2)/sizeof(aSetP
e1f0: 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  2[0]) );.       
e200: 20 20 20 61 53 65 74 50 32 5b 6e 53 65 74 50 32     aSetP2[nSetP2
e210: 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  ++] = addr;.    
e220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e230: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e240: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
e250: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
e260: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
e270: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
e280: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
e290: 74 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20  tmost->usesEphm 
e2a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
e2b0: 20 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72         createSor
e2c0: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
e2d0: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
e2e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e2f0: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
e300: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e310: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
e320: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
e330: 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
e340: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
e350: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
e360: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
e370: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
e380: 65 2c 20 70 50 72 69 6f 72 2c 20 70 72 69 6f 72  e, pPrior, prior
e390: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c  Op, unionTab, 0,
e3a0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
e3b0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e3c0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e3d0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e3e0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
e3f0: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
e400: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
e410: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
e420: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
e430: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
e440: 5f 45 58 43 45 50 54 3a 20 20 6f 70 20 3d 20 53  _EXCEPT:  op = S
e450: 52 54 5f 45 78 63 65 70 74 3b 20 20 20 62 72 65  RT_Except;   bre
e460: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61 73  ak;.         cas
e470: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70  e TK_UNION:   op
e480: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20   = SRT_Union;   
e490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e4a0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
e4b0: 20 20 6f 70 20 3d 20 53 52 54 5f 54 61 62 6c 65    op = SRT_Table
e4c0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
e4d0: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
e4e0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
e4f0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
e500: 20 20 20 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f        p->disallo
e510: 77 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  wOrderBy = pOrde
e520: 72 42 79 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c  rBy!=0;.      pL
e530: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
e540: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
e550: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
e560: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
e570: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
e580: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
e590: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
e5a0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c  t(pParse, p, op,
e5b0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
e5c0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
e5d0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
e5e0: 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
e5f0: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
e610: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  xprDelete(p->pLi
e620: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
e630: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
e640: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e650: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
e660: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31    p->iLimit = -1
e670: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
e680: 65 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  et = -1;.      i
e690: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e6a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e6b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e6c0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
e6d0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
e6e0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
e6f0: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
e700: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
e710: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
e720: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
e730: 20 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20     */      .    
e740: 20 20 69 66 28 20 65 44 65 73 74 21 3d 70 72 69    if( eDest!=pri
e750: 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62  orOp || unionTab
e760: 21 3d 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20  !=iParm ){.     
e770: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
e780: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
e790: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e7a0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
e7b0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
e7c0: 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  T_Callback ){.  
e7d0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
e7e0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
e7f0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
e800: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
e810: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
e820: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
e830: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
e840: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
e850: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
e860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e870: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
e880: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e890: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
e8a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
e8b0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e8c0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
e8d0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
e8e0: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
e8f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e900: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
e910: 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
e920: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e930: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
e940: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e950: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 72 63  r(v);.        rc
e960: 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
e970: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
e980: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
e990: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
e9a0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20    pOrderBy, -1, 
e9d0: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6e              iCon
ea00: 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20  t, iBreak, 0);. 
ea10: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
ea20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ea30: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
ea40: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ea50: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
ea60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ea70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
ea80: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
ea90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eaa0: 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  p(v, OP_Next, un
eab0: 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
eac0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ead0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
eae0: 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
eaf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eb00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
eb10: 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  e, unionTab, 0);
eb20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
eb30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
eb40: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
eb50: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  T: {.      int t
eb60: 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
eb70: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
eb80: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
eb90: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
eba0: 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
ebb0: 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 20 20 20  int addr;..     
ebc0: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
ebd0: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
ebe0: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
ebf0: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
ec00: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
ec10: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
ec20: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
ec30: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
ec40: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
ec50: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
ec60: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
ec70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
ec80: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
ec90: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
eca0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
ecb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
ecc0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
ecd0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
ece0: 72 73 65 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74  rse,p,pOrderBy,t
ecf0: 61 62 31 2c 31 29 20 29 7b 0a 20 20 20 20 20 20  ab1,1) ){.      
ed00: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
ed10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
ed20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
ed30: 0a 20 20 20 20 20 20 63 72 65 61 74 65 53 6f 72  .      createSor
ed40: 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65  tingIndex(pParse
ed50: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  , p, pOrderBy);.
ed60: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
ed70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ed80: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
ed90: 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
eda0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
edb0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
edc0: 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
edd0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
ede0: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
edf0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73  ->pRightmost->us
ee00: 65 73 45 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20  esEphm = 1;.    
ee10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ee20: 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
ee30: 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
ee40: 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
ee50: 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
ee60: 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
ee70: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
ee80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ee90: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 53 52 54  rse, pPrior, SRT
eea0: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c  _Union, tab1, 0,
eeb0: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
eec0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
eed0: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
eee0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
eef0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ef00: 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
ef10: 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
ef20: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
ef30: 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
ef40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ef50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
ef60: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
ef70: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b2, 0);.      as
ef80: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
ef90: 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29  nEphm[1] == -1 )
efa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
efb0: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64  penEphm[1] = add
efc0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
efd0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
efe0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
eff0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
f000: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
f010: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
f020: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
f030: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  set = 0;.      r
f040: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
f050: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 53 52 54  t(pParse, p, SRT
f060: 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c  _Union, tab2, 0,
f070: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
f080: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
f090: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  Prior;.      sql
f0a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
f0b0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
f0c0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
f0d0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
f0e0: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
f0f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
f100: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
f110: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f120: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f130: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
f140: 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
f150: 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
f160: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
f170: 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
f180: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
f190: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
f1a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
f1b0: 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
f1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
f1d0: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
f1e0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
f1f0: 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
f200: 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
f210: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
f220: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
f230: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
f240: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
f250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f260: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
f270: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
f280: 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
f290: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
f2a0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
f2b0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f2c0: 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
f2d0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
f2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f2f0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
f300: 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
f310: 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
f320: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f330: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
f340: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
f350: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f360: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
f370: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72   iCont);.      r
f380: 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
f390: 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
f3a0: 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20  ->pEList, tab1, 
f3b0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f3c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f3e0: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
f3f0: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
f420: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
f430: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f440: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f450: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f460: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f470: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f480: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f490: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
f4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f4b0: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74  Op(v, OP_Next, t
f4c0: 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  ab1, iStart);.  
f4d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
f4e0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
f4f0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
f500: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
f510: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32  , OP_Close, tab2
f520: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
f530: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
f540: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
f550: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
f560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f570: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
f580: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
f590: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
f5a0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
f5b0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
f5c0: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
f5d0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
f5e0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
f5f0: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
f600: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
f610: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
f620: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
f630: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f640: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f650: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
f660: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
f670: 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
f680: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
f690: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
f6a0: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
f6b0: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
f6c0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
f6d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f6e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
f6f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
f700: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f710: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f720: 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20  s.  */.  nCol = 
f730: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
f740: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 53 65 74 50  ;.  while( nSetP
f750: 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  2 ){.    sqlite3
f760: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
f770: 61 53 65 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d  aSetP2[--nSetP2]
f780: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , nCol);.  }..  
f790: 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61  /* Compute colla
f7a0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75  ting sequences u
f7b0: 73 65 64 20 62 79 20 65 69 74 68 65 72 20 74 68  sed by either th
f7c0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
f7d0: 65 20 6f 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79  e or.  ** by any
f7e0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f7f0: 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
f800: 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
f810: 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
f820: 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
f830: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
f840: 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
f850: 62 6c 65 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68  bles.  Invoke th
f860: 65 0a 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20  e.  ** ORDER BY 
f870: 70 72 6f 63 65 73 73 69 6e 67 20 69 66 20 74 68  processing if th
f880: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
f890: 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  BY clause..  **.
f8a0: 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
f8b0: 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
f8c0: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
f8d0: 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
f8e0: 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
f8f0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
f900: 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
f910: 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
f920: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
f930: 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
f940: 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
f950: 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
f960: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
f970: 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
f980: 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
f990: 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
f9a0: 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75  pOrderBy || p->u
f9b0: 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20 20 69  sesEphm ){.    i
f9c0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f9e0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
f9f0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
fa00: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
fa10: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
fa20: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
fa30: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
fa40: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
fa70: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
fa80: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
fa90: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fab0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
fac0: 65 73 20 69 6e 20 70 4b 65 79 49 6e 66 6f 2d 3e  es in pKeyInfo->
fad0: 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f  aCol[] */.    Co
fae0: 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20  llSeq **apColl; 
faf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fb00: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
fb10: 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  gh pKeyInfo->aCo
fb20: 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ll[] */.    Coll
fb30: 53 65 71 20 2a 2a 61 43 6f 70 79 3b 20 20 20 20  Seq **aCopy;    
fb40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
fb50: 6f 70 79 20 6f 66 20 70 4b 65 79 49 6e 66 6f 2d  opy of pKeyInfo-
fb60: 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 0a 20 20 20  >aColl[] */..   
fb70: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
fb80: 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
fb90: 20 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20   nKeyCol = nCol 
fba0: 2b 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  + (pOrderBy ? pO
fbb0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
fbc0: 30 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  0);.    pKeyInfo
fbd0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
fbe0: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
fbf0: 29 2b 6e 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f  )+nKeyCol*(sizeo
fc00: 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29  f(CollSeq*) + 1)
fc10: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
fc20: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
fc30: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
fc40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
fc50: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
fc60: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
fc70: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  o->enc = ENC(pPa
fc80: 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b  rse->db);.    pK
fc90: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
fca0: 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28   nCol;..    for(
fcb0: 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
fcc0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
fcd0: 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
fce0: 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
fcf0: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
fd00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
fd10: 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
fd20: 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
fd30: 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
fd40: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
fd50: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
fd60: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
fd70: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
fd80: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
fd90: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
fda0: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
fdb0: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
fdc0: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
fdd0: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
fde0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
fdf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
fe00: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
fe10: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
fe20: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
fe30: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
fe40: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
fe50: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
fe60: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
fe70: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
fe80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
fe90: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
fea0: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
feb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fed0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fee0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
fef0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ff00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ff10: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
ff20: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
ff30: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
ff40: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
ff50: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
ff60: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ff70: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
ff80: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
ff90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65  rList_item *pOTe
ffa0: 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  rm = pOrderBy->a
ffb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64  ;.      int nOrd
ffc0: 65 72 42 79 45 78 70 72 20 3d 20 70 4f 72 64 65  erByExpr = pOrde
ffd0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
ffe0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
fff0: 20 20 75 38 20 2a 70 53 6f 72 74 4f 72 64 65 72    u8 *pSortOrder
10000 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 75 73  ;..      /* Reus
10010 65 20 74 68 65 20 73 61 6d 65 20 70 4b 65 79 49  e the same pKeyI
10020 6e 66 6f 20 66 6f 72 20 74 68 65 20 4f 52 44 45  nfo for the ORDE
10030 52 20 42 59 20 61 73 20 77 61 73 20 75 73 65 64  R BY as was used
10040 20 61 62 6f 76 65 20 66 6f 72 0a 20 20 20 20 20   above for.     
10050 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
10060 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
10070 74 73 2e 20 20 45 78 63 65 70 74 20 77 65 20 68  ts.  Except we h
10080 61 76 65 20 74 6f 20 63 68 61 6e 67 65 20 6f 75  ave to change ou
10090 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  t the.      ** p
100a0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
100b0 20 76 61 6c 75 65 73 2e 20 20 53 6f 6d 65 20 6f   values.  Some o
100c0 66 20 74 68 65 20 61 43 6f 6c 6c 5b 5d 20 76 61  f the aColl[] va
100d0 6c 75 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 20  lues will be.   
100e0 20 20 20 2a 2a 20 72 65 75 73 65 64 20 77 68 65     ** reused whe
100f0 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
10100 68 65 20 70 4b 65 79 49 6e 66 6f 20 66 6f 72 20  he pKeyInfo for 
10110 74 68 65 20 4f 52 44 45 52 20 42 59 2c 20 73 6f  the ORDER BY, so
10120 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 61   make.      ** a
10130 20 63 6f 70 79 2e 20 20 53 75 66 66 69 63 69 65   copy.  Sufficie
10140 6e 74 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  nt space to hold
10150 20 62 6f 74 68 20 74 68 65 20 6e 43 6f 6c 20 65   both the nCol e
10160 6e 74 72 69 65 73 20 66 6f 72 0a 20 20 20 20 20  ntries for.     
10170 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
10180 20 73 65 6c 65 63 74 20 61 6e 64 20 74 68 65 20   select and the 
10190 6e 4f 72 64 65 72 62 79 45 78 70 72 20 65 6e 74  nOrderbyExpr ent
101a0 72 69 65 73 20 66 6f 72 20 74 68 65 20 4f 52 44  ries for the ORD
101b0 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 77  ER BY.      ** w
101c0 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f  as allocated abo
101d0 76 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ve.  But we need
101e0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6d   to move the com
101f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 0a 20 20 20  pound select.   
10200 20 20 20 2a 2a 20 65 6e 74 72 69 65 73 20 6f 75     ** entries ou
10210 74 20 6f 66 20 74 68 65 20 77 61 79 20 62 65 66  t of the way bef
10220 6f 72 65 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  ore constructing
10230 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e   the ORDER BY en
10240 74 72 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  tries..      ** 
10250 4d 6f 76 65 20 74 68 65 20 63 6f 6d 70 6f 75 6e  Move the compoun
10260 64 20 73 65 6c 65 63 74 20 65 6e 74 72 69 65 73  d select entries
10270 20 69 6e 74 6f 20 61 43 6f 70 79 5b 5d 20 77 68   into aCopy[] wh
10280 65 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 0a  ere they can be.
10290 20 20 20 20 20 20 2a 2a 20 61 63 63 65 73 73 65        ** accesse
102a0 64 20 61 6e 64 20 72 65 75 73 65 64 20 77 68 65  d and reused whe
102b0 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74  n constructing t
102c0 68 65 20 4f 52 44 45 52 20 42 59 20 65 6e 74 72  he ORDER BY entr
102d0 69 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  ies..      ** Be
102e0 63 61 75 73 65 20 6e 43 6f 6c 20 6d 69 67 68 74  cause nCol might
102f0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
10300 20 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 6e 4f   or less than nO
10310 72 64 65 72 42 79 45 78 70 72 0a 20 20 20 20 20  rderByExpr.     
10320 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 75   ** we have to u
10330 73 65 20 6d 65 6d 6d 6f 76 65 28 29 20 77 68 65  se memmove() whe
10340 6e 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 70 79  n doing the copy
10350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10360 20 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e   aCopy = &pKeyIn
10370 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72  fo->aColl[nOrder
10380 42 79 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  ByExpr];.      p
10390 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79  SortOrder = pKey
103a0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
103b0 20 3d 20 28 75 38 2a 29 26 61 43 6f 70 79 5b 6e   = (u8*)&aCopy[n
103c0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  Col];.      memm
103d0 6f 76 65 28 61 43 6f 70 79 2c 20 70 4b 65 79 49  ove(aCopy, pKeyI
103e0 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20 6e 43 6f 6c  nfo->aColl, nCol
103f0 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
10400 29 29 3b 0a 0a 20 20 20 20 20 20 61 70 43 6f 6c  ));..      apCol
10410 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
10420 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  oll;.      for(i
10430 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 45 78  =0; i<nOrderByEx
10440 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65 72 6d 2b  pr; i++, pOTerm+
10450 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20 70 53 6f  +, apColl++, pSo
10460 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20 20 20 20  rtOrder++){.    
10470 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
10480 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78 70 72 3b  = pOTerm->pExpr;
10490 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 45  .        if( (pE
104a0 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
104b0 45 78 70 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20  ExpCollate) ){. 
104c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
104d0 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 21 3d 30   pExpr->pColl!=0
104e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   );.          *a
104f0 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
10500 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
10510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
10520 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70 79 5b 70  apColl = aCopy[p
10530 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a  Expr->iColumn];.
10540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10550 20 20 2a 70 53 6f 72 74 4f 72 64 65 72 20 3d 20    *pSortOrder = 
10560 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65  pOTerm->sortOrde
10570 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
10580 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
10590 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20  htmost==p );.   
105a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
105b0 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3e 3d 30  drOpenEphm[2]>=0
105c0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d   );.      addr =
105d0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
105e0 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [2];.      sqlit
105f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
10600 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45 4c 69 73  , addr, p->pELis
10610 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20  t->nExpr+2);.   
10620 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
10630 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 45 78  eld = nOrderByEx
10640 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
10650 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
10660 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
10670 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
10680 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
10690 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b     pKeyInfo = 0;
106a0 0a 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 53  .      generateS
106b0 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
106c0 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p, v, p->pEList-
106d0 3e 6e 45 78 70 72 2c 20 65 44 65 73 74 2c 20 69  >nExpr, eDest, i
106e0 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Parm);.    }..  
106f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4b 65    sqliteFree(pKe
10700 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
10710 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
10720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
10730 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10740 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
10750 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
10760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10770 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
10780 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
10790 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
107a0 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
107b0 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
107c0 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
107d0 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
107e0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
107f0 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
10800 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
10810 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
10820 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
10830 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
10840 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
10850 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
10860 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
10870 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
10880 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
10890 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
108a0 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
108b0 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
108c0 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
108d0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
108e0 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
108f0 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
10900 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
10910 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
10920 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
10930 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
10940 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
10950 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
10960 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
10970 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
10980 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
10990 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
109a0 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
109b0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
109c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
109d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
109e0 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78 70  ubstExprList(Exp
109f0 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78 70 72 4c  rList*,int,ExprL
10a00 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61  ist*);  /* Forwa
10a10 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69  rd Decl */.stati
10a20 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
10a30 63 74 28 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74  ct(Select *, int
10a40 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 20 20  , ExprList *);  
10a50 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20  /* Forward Decl 
10a60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10a70 75 62 73 74 45 78 70 72 28 45 78 70 72 20 2a 70  ubstExpr(Expr *p
10a80 45 78 70 72 2c 20 69 6e 74 20 69 54 61 62 6c 65  Expr, int iTable
10a90 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
10aa0 73 74 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  st){.  if( pExpr
10ab0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10ac0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
10ad0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
10ae0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
10af0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
10b00 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
10b10 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
10b20 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
10b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
10b40 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
10b50 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
10b60 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
10b70 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
10b80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10b90 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
10ba0 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
10bb0 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ht==0 && pExpr->
10bc0 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
10bd0 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d    pNew = pEList-
10be0 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
10bf0 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  n].pExpr;.      
10c00 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20  assert( pNew!=0 
10c10 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
10c20 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20  op = pNew->op;. 
10c30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
10c40 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a  pr->pLeft==0 );.
10c50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
10c60 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
10c70 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65 66 74 29  Dup(pNew->pLeft)
10c80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10c90 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
10ca0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
10cb0 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
10cc0 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70  3ExprDup(pNew->p
10cd0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
10ce0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
10cf0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
10d00 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
10d10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10d20 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20  (pNew->pList);. 
10d30 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
10d40 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
10d50 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
10d60 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
10d70 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
10d80 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
10d90 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
10da0 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
10db0 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
10dc0 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
10dd0 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26  &pExpr->token, &
10de0 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  pNew->token);.  
10df0 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
10e00 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 73 70 61  Copy(&pExpr->spa
10e10 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b  n, &pNew->span);
10e20 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 53  .      pExpr->pS
10e30 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
10e40 65 6c 65 63 74 44 75 70 28 70 4e 65 77 2d 3e 70  electDup(pNew->p
10e50 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
10e60 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
10e70 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
10e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
10e90 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
10ea0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
10eb0 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
10ec0 45 78 70 72 28 70 45 78 70 72 2d 3e 70 52 69 67  Expr(pExpr->pRig
10ed0 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
10ee0 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65  st);.    substSe
10ef0 6c 65 63 74 28 70 45 78 70 72 2d 3e 70 53 65 6c  lect(pExpr->pSel
10f00 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
10f10 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
10f20 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e 70  xprList(pExpr->p
10f30 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
10f40 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
10f50 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
10f60 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
10f70 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69 54 61 62  *pList, int iTab
10f80 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
10f90 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
10fa0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
10fb0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
10fc0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
10fd0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
10fe0 62 73 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  bstExpr(pList->a
10ff0 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
11000 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
11010 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
11020 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
11030 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
11040 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
11050 74 29 7b 0a 20 20 69 66 28 20 21 70 20 29 20 72  t){.  if( !p ) r
11060 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
11070 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74  prList(p->pEList
11080 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
11090 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
110a0 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  st(p->pGroupBy, 
110b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
110c0 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
110d0 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54  (p->pOrderBy, iT
110e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
110f0 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 48   substExpr(p->pH
11100 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
11110 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
11120 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 69  xpr(p->pWhere, i
11130 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
11140 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11150 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11160 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 6e 64  _VIEW) */..#ifnd
11170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11180 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  IEW./*.** This r
11190 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
111a0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
111b0 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20 74  eries in order t
111c0 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63 75  o speed.** execu
111d0 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72 6e  tion.  It return
111e0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
111f0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
11200 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a   no flattening.*
11210 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  * occurs..**.** 
11220 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
11230 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
11240 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
11250 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
11260 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
11270 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
11280 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
11290 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
112a0 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
112b0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
112c0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
112d0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
112e0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
112f0 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
11300 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
11310 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
11320 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11330 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
11340 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
11350 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
11360 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
11370 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
11380 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
11390 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
113a0 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
113b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
113c0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
113d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
113e0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
113f0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
11400 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
11410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11420 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
11430 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
11440 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
11450 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
11460 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
11470 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
11480 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
11490 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
114a0 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
114b0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
114c0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
114d0 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
114e0 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
114f0 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
11500 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
11510 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
11520 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
11530 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
11540 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
11550 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
11560 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
11570 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
11580 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
11590 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
115a0 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
115b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
115c0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
115d0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
115e0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
115f0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11600 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
11610 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
11620 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11630 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
11640 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11650 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11660 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
11670 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
11680 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
11690 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
116a0 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a 2a 20 20  er join, or.**  
116b0 20 20 20 20 20 20 74 68 65 20 73 75 62 71 75 65        the subque
116c0 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
116d0 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69 63 6b 65   a join.  (Ticke
116e0 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a 20 20 20  t #306).**.**   
116f0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
11700 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
11710 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
11720 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
11730 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  in..**.**   (5) 
11740 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
11750 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72   not DISTINCT or
11760 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11770 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
11780 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
11790 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20  es..**.**   (6) 
117a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
117b0 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
117c0 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
117d0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
117e0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
117f0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20  CT..**.**   (7) 
11800 20 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61   The subquery ha
11810 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  s a FROM clause.
11820 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68  .**.**   (8)  Th
11830 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
11840 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
11850 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11860 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
11870 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65  **.**   (9)  The
11880 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
11890 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
118a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
118b0 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
118c0 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
118d0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20  s..**.**  (10)  
118e0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
118f0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
11900 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
11910 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
11920 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
11930 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31  IMIT..**.**  (11
11940 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11950 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
11960 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11970 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
11980 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  auses..**.**  (1
11990 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
119a0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
119b0 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
119c0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f 72 20 74   OUTER JOIN or t
119d0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
119e0 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
119f0 52 45 20 63 6c 61 75 73 65 2e 20 20 28 61 64 64  RE clause.  (add
11a00 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
11a10 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0).**.**  (13)  
11a20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
11a30 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
11a40 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
11a50 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  IT.**.**  (14)  
11a60 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
11a70 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
11a80 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
11a90 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
11aa0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
11ab0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
11ac0 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
11ad0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
11ae0 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20 4f  t have both an O
11af0 52 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c 49  RDER BY and a LI
11b00 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  MIT clause..**  
11b10 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
11b20 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20 49  t #2339).**.** I
11b30 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  n this routine, 
11b40 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  the "p" paramete
11b50 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
11b60 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  o the outer quer
11b70 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65  y..** The subque
11b80 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61  ry is p->pSrc->a
11b90 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20  [iFrom].  isAgg 
11ba0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
11bb0 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73  uter query.** us
11bc0 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e  es aggregates an
11bd0 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  d subqueryIsAgg 
11be0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73  is true if the s
11bf0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
11c00 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  regates..**.** I
11c10 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
11c20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74  not attempted, t
11c30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11c40 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72   no-op and retur
11c50 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74  ns 0..** If flat
11c60 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70  tening is attemp
11c70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ted this routine
11c80 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a   returns 1..**.*
11c90 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70  * All of the exp
11ca0 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
11cb0 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62   must occur on b
11cc0 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75  oth the outer qu
11cd0 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ery and.** the s
11ce0 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74  ubquery before t
11cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
11d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11d10 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
11d20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11d30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11d40 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
11d50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11d60 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11d80 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
11d90 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
11da0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
11db0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
11dc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
11dd0 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
11de0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
11df0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
11e00 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
11e10 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
11e20 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
11e30 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11e40 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11e50 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
11e60 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
11e70 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
11e80 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
11e90 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
11ea0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
11eb0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
11ec0 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
11ed0 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
11ee0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
11ef0 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
11f00 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
11f10 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
11f20 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
11f30 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
11f40 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
11f50 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
11f60 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
11f70 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
11f80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
11f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
11fa0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11fb0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11fd0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11fe0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
11ff0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12000 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
12010 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
12020 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
12030 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
12040 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
12050 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
12060 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
12070 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12080 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
12090 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
120a0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
120b0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
120c0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
120d0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
120e0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
120f0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
12100 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
12110 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
12120 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
12130 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
12140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12150 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
12160 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
12170 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
12180 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
12190 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
121a0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
121b0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
121c0 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
121d0 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
121e0 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
121f0 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
12200 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
12210 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
12220 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
12230 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
12240 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
12250 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
12260 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
12270 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
12280 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
12290 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
122a0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
122b0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
122c0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
122d0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
122e0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
122f0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
12300 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
12310 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
12320 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
12330 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
12340 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
12350 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
12360 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
12370 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
12380 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
12390 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
123c0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
123d0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26  p->pRightmost &&
123e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
123f0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
12400 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12440 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
12450 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
12460 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
12470 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
124a0 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  7)  */.  if( (pS
124b0 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c  ub->isDistinct |
124c0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
124d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
124e0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
124f0 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
12500 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
12510 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
12520 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
12530 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
12540 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26   p->isDistinct &
12550 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
12560 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
12570 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
12580 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28  on (6)  */.  if(
12590 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64   (p->disallowOrd
125a0 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65  erBy || p->pOrde
125b0 72 42 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f  rBy) && pSub->pO
125c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
125d0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
12610 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (11) */.  }.. 
12620 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
12630 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
12640 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
12650 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
12660 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
12670 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
12680 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
12690 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
126a0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
126b0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
126c0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
126d0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
126e0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
126f0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
12700 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
12710 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
12720 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
12730 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
12740 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
12750 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
12760 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
12770 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
12780 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f  same thing..  */
12790 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
127a0 6e 53 72 63 3e 31 20 26 26 20 28 70 53 75 62 69  nSrc>1 && (pSubi
127b0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
127c0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
127d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
127e0 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
127f0 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
12800 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
12810 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
12820 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
12830 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
12840 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
12850 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
12860 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
12870 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
12880 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
12890 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
128a0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
128b0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
128c0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
128d0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
128e0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
128f0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
12900 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
12910 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
12920 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
12930 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
12940 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
12950 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
12960 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
12970 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
12980 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
12990 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
129a0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
129b0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
129c0 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OIN..  */.  if( 
129d0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
129e0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
129f0 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65  =0 && pSub->pWhe
12a00 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  re!=0 ){.    ret
12a10 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
12a20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
12a30 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
12a40 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  s flattening is 
12a50 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68  permitted for th
12a60 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20  e.  ** iFrom-th 
12a70 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
12a80 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
12a90 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
12aa0 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c  /..  /* Move all
12ab0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65   of the FROM ele
12ac0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62  ments of the sub
12ad0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
12ae0 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
12af0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
12b00 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20   query.  Before 
12b10 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65  doing this, reme
12b20 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75  mber.  ** the cu
12b30 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
12b40 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74  the original out
12b50 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c  er query FROM el
12b60 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50  ement in.  ** iP
12b70 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
12b80 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
12b90 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
12ba0 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
12bb0 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65    ** will scan e
12bc0 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69  xpressions looki
12bd0 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72  ng for iParent r
12be0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65  eferences and re
12bf0 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65  place.  ** those
12c00 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68   references with
12c10 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
12c20 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65  t resolve to the
12c30 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20   subquery FROM. 
12c40 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
12c50 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
12c60 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65  in..  */.  iPare
12c70 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
12c80 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20  Cursor;.  {.    
12c90 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53  int nSubSrc = pS
12ca0 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20  ubSrc->nSrc;.   
12cb0 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
12cc0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
12cd0 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
12ce0 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62  DeleteTable(pSub
12cf0 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  item->pTab);.   
12d00 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75 62   sqliteFree(pSub
12d10 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
12d20 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12d30 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65  (pSubitem->zName
12d40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12d50 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  e(pSubitem->zAli
12d60 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75  as);.    if( nSu
12d70 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
12d80 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75 62  int extra = nSub
12d90 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20 66  Src - 1;.      f
12da0 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53 72  or(i=1; i<nSubSr
12db0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
12dc0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
12dd0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53 72  rcListAppend(pSr
12de0 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  c, 0, 0);.      
12df0 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 20  }.      p->pSrc 
12e00 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  = pSrc;.      fo
12e10 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
12e20 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d  ; i-extra>=iFrom
12e30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  ; i--){.        
12e40 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72  pSrc->a[i] = pSr
12e50 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20  c->a[i-extra];. 
12e60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12e70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
12e80 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
12e90 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
12ea0 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
12eb0 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
12ec0 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
12ed0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
12ee0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
12ef0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
12f00 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
12f10 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20  ointype;.  }..  
12f20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
12f30 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
12f40 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
12f50 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
12f60 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
12f70 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
12f80 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
12f90 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61  ..  ** .  ** Exa
12fa0 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
12fb0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
12fc0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
12fd0 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
12fe0 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
12ff0 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c  RE a>b;.  **   \
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
13020 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
13030 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
13040 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f    /.  **    \___
13050 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
13060 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
13070 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
13080 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
13090 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b   **.  ** We look
130a0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
130b0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
130c0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
130d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
130e0 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
130f0 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
13100 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
13110 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
13120 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a  tute "y+10"..  *
13130 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70  /.  pList = p->p
13140 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  EList;.  for(i=0
13150 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
13160 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
13170 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28   *pExpr;.    if(
13180 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
13190 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20  me==0 && (pExpr 
131a0 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
131b0 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  xpr)->span.z!=0 
131c0 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  ){.      pList->
131d0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[i].zName = sql
131e0 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61 72  iteStrNDup((char
131f0 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
13200 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
13210 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62  .    }.  }.  sub
13220 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  stExprList(p->pE
13230 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
13240 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
13250 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
13260 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
13270 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
13280 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
13290 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
132a0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
132b0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
132c0 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ist);.  }.  if( 
132d0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
132e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
132f0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
13300 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
13310 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
13320 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64  ;.    pSub->pOrd
13330 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
13340 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42  e if( p->pOrderB
13350 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  y ){.    substEx
13360 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
13370 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
13380 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  b->pEList);.  }.
13390 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
133a0 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65  re ){.    pWhere
133b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
133c0 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b  p(pSub->pWhere);
133d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57  .  }else{.    pW
133e0 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  here = 0;.  }.  
133f0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
13400 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
13410 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
13420 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
13430 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
13440 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57    p->pWhere = pW
13450 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45  here;.    substE
13460 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
13470 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
13480 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
13490 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
134a0 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69  ExprAnd(p->pHavi
134b0 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44  ng, sqlite3ExprD
134c0 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  up(pSub->pHaving
134d0 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
134e0 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
134f0 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
13500 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
13510 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72  istDup(pSub->pGr
13520 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  oupBy);.  }else{
13530 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
13540 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
13550 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
13560 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
13570 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
13580 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65  (p->pWhere, pWhe
13590 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  re);.  }..  /* T
135a0 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65  he flattened que
135b0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69  ry is distinct i
135c0 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e  f either the inn
135d0 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f  er or the.  ** o
135e0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
135f0 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20  stinct. .  */.  
13600 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  p->isDistinct = 
13610 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  p->isDistinct ||
13620 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
13630 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45  t;..  /*.  ** SE
13640 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
13650 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
13660 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
13670 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
13680 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74  **.  ** One is t
13690 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f  empted to try to
136a0 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20   add a and b to 
136b0 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69  combine the limi
136c0 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20  ts.  But this.  
136d0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
136e0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
136f0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
13700 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
13710 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
13720 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
13730 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d  Limit;.    pSub-
13740 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d  >pLimit = 0;.  }
13750 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
13760 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
13770 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
13780 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
13790 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
137a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
137b0 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a  ctDelete(pSub);.
137c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
137d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
137e0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
137f0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
13800 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
13810 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20  passed in as an 
13820 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
13830 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69  if it.** is a si
13840 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
13850 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20 69  x() query.  If i
13860 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71 75  t is and this qu
13870 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61  ery can be.** sa
13880 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61 20  tisfied using a 
13890 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74  single seek to t
138a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20  he beginning or 
138b0 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c  end of an index,
138c0 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74  .** then generat
138d0 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  e the code for t
138e0 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72  his SELECT and r
138f0 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69  eturn 1.  If thi
13900 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73  s is not a .** s
13910 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
13920 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e  ax() query, then
13930 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a   return 0;.**.**
13940 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20   A simply min() 
13950 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c  or max() query l
13960 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ooks like this:.
13970 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
13980 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  min(a) FROM tabl
13990 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  e;.**    SELECT 
139a0 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c  max(a) FROM tabl
139b0 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  e;.**.** The que
139c0 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79  ry may have only
139d0 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
139e0 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75  in its FROM argu
139f0 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ment.  There.** 
13a00 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20  can be no GROUP 
13a10 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20  BY or HAVING or 
13a20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20  WHERE clauses.  
13a30 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  The result set m
13a40 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69  ust.** be the mi
13a50 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20  n() or max() of 
13a60 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
13a70 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
13a80 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20  he column.** in 
13a90 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  the min() or max
13aa0 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
13ab0 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a   be indexed..**.
13ac0 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  ** The parameter
13ad0 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
13ae0 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  e are the same a
13af0 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c  s for sqlite3Sel
13b00 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68  ect()..** See th
13b10 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
13b20 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
13b30 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
13b40 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
13b50 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c  static int simpl
13b60 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72  eMinMaxQuery(Par
13b70 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
13b80 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74  ct *p, int eDest
13b90 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
13ba0 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69  Expr *pExpr;.  i
13bb0 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65  nt iCol;.  Table
13bc0 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
13bd0 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73  *pIdx;.  int bas
13be0 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  e;.  Vdbe *v;.  
13bf0 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78  int seekOp;.  Ex
13c00 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
13c10 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20  *pList, eList;. 
13c20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13c30 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b  _item eListItem;
13c40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
13c50 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69  ;.  int brk;.  i
13c60 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68  nt iDb;..  /* Ch
13c70 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
13c80 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73 69  is query is a si
13c90 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mple min() or ma
13ca0 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74 75  x() query.  Retu
13cb0 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20  rn.  ** zero if 
13cc0 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f  it is  not..  */
13cd0 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
13ce0 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67  By || p->pHaving
13cf0 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20   || p->pWhere ) 
13d00 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
13d10 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
13d20 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
13d30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45  ) return 0;.  pE
13d40 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
13d50 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
13d60 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
13d70 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  n 0;.  pExpr = p
13d80 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
13d90 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
13da0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
13db0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
13dc0 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d    pList = pExpr-
13dd0 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c  >pList;.  if( pL
13de0 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ist==0 || pList-
13df0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
13e00 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
13e10 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20  r->token.n!=3 ) 
13e20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
13e30 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
13e40 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
13e50 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d  ken.z,"min",3)==
13e60 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20  0 ){.    seekOp 
13e70 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d  = OP_Rewind;.  }
13e80 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
13e90 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
13ea0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22  pExpr->token.z,"
13eb0 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  max",3)==0 ){.  
13ec0 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61    seekOp = OP_La
13ed0 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
13ee0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
13ef0 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   pExpr = pList->
13f00 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
13f10 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
13f20 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
13f30 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70  0;.  iCol = pExp
13f40 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54  r->iColumn;.  pT
13f50 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e  ab = pSrc->a[0].
13f60 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  pTab;..  /* This
13f70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
13f80 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74  nnot be used wit
13f90 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  h virtual tables
13fa0 2e 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72  . */.  if( IsVir
13fb0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
13fc0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
13fd0 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20  we get to here, 
13fe0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65  it means the que
13ff0 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ry is of the cor
14000 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20  rect form..  ** 
14010 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
14020 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e  re we have an in
14030 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64  dex and make pId
14040 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  x point to the. 
14050 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20   ** appropriate 
14060 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d  index.  If the m
14070 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73  in() or max() is
14080 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50   on an INTEGER P
14090 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20  RIMARY.  ** key 
140a0 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78  column, no index
140b0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f   is necessary so
140c0 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c   set pIdx to NUL
140d0 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75  L.  If no.  ** u
140e0 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66  sable index is f
140f0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  ound, return 0..
14100 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c    */.  if( iCol<
14110 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20  0 ){.    pIdx = 
14120 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14130 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
14140 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
14150 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
14160 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  r);.    if( pCol
14170 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
14180 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
14190 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
141a0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
141b0 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
141c0 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
141d0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=1 );.      if(
141e0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
141f0 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20  0]==iCol && .   
14200 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
14210 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61  3StrICmp(pIdx->a
14220 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d  zColl[0], pColl-
14230 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  >zName) ){.     
14240 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14250 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14260 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
14270 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64   0;.  }..  /* Id
14280 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79  entify column ty
14290 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62  pes if we will b
142a0 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c  e using the call
142b0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
142c0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
142d0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
142e0 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62  s going to a tab
142f0 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63  le or a memory c
14300 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f  ell..  ** The co
14310 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20  lumn names have 
14320 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e  already been gen
14330 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63 61  erated in the ca
14340 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
14350 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
14360 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14370 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
14380 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
14390 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
143a0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
143b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
143c0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
143d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65  ..  */.  if( eDe
143e0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
143f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14400 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
14410 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50  penEphemeral, iP
14420 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  arm, 1);.  }..  
14430 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f  /* Generating co
14440 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  de to find the m
14450 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20  in or the max.  
14460 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65  Basically all we
14470 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f   have.  ** to do
14480 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69 72   is find the fir
14490 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65  st or the last e
144a0 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73  ntry in the chos
144b0 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20  en index.  If.  
144c0 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20  ** the min() or 
144d0 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20  max() is on the 
144e0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
144f0 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74  KEY, then find t
14500 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72  he first.  ** or
14510 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
14520 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20  he main table.. 
14530 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
14540 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14550 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
14560 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
14570 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c  ssert( iDb>=0 ||
14580 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 29   pTab->isEphem )
14590 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
145a0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
145b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
145c0 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
145d0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
145e0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
145f0 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20 3d 20  Name);.  base = 
14600 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
14610 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71 6c 69  or;.  brk = sqli
14620 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14630 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
14640 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14650 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a 20 20  rse, p, brk);.  
14660 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70  if( pSrc->a[0].p
14670 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
14680 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
14690 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20  e(pParse, base, 
146a0 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
146b0 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20 20 69  enRead);.  }.  i
146c0 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20  f( pIdx==0 ){.  
146d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
146e0 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62 61  Op(v, seekOp, ba
146f0 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  se, 0);.  }else{
14700 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  .    /* Even tho
14710 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20 75  ugh the cursor u
14720 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
14730 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63 6c  index here is cl
14740 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 73  osed.    ** as s
14750 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65 20  oon as a single 
14760 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20 72  value has been r
14770 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c 6c  ead from it, all
14780 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20  ocate it.    ** 
14790 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e 6e  using (pParse->n
147a0 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65 6e  Tab++) to preven
147b0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64 20  t the cursor id 
147c0 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20 20  from being .    
147d0 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73 20  ** reused. This 
147e0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72  is important for
147f0 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 74   statements of t
14800 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a 20  he form .    ** 
14810 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 53  "INSERT INTO x S
14820 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f 4d  ELECT max() FROM
14830 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   x"..    */.    
14840 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 4b 65  int iIdx;.    Ke
14850 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73 71  yInfo *pKey = sq
14860 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
14870 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
14880 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50 61 72  .    iIdx = pPar
14890 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
148a0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
148b0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
148c0 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
148d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
148e0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
148f0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14900 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
14910 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70 49  enRead, iIdx, pI
14920 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20 20  dx->tnum, .     
14930 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20     (char*)pKey, 
14940 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P3_KEYINFO_HANDO
14950 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65  FF);.    if( see
14960 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29  kOp==OP_Rewind )
14970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14980 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
14990 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ull, 0, 0);.    
149a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
149b0 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
149c0 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ord, 1, 0);.    
149d0 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d 6f    seekOp = OP_Mo
149e0 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  veGt;.    }.    
149f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a00 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64 78  (v, seekOp, iIdx
14a10 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14a20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14a30 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 2c  _IdxRowid, iIdx,
14a40 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14a50 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14a60 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29 3b  Close, iIdx, 0);
14a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14a80 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
14a90 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20 20  Ge, base, 0);.  
14aa0 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72 20  }.  eList.nExpr 
14ab0 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 65  = 1;.  memset(&e
14ac0 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69 7a  ListItem, 0, siz
14ad0 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29 3b  eof(eListItem));
14ae0 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65 4c  .  eList.a = &eL
14af0 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73 74  istItem;.  eList
14b00 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45  .a[0].pExpr = pE
14b10 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  xpr;.  selectInn
14b20 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
14b30 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , &eList, 0, 0, 
14b40 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  0, -1, eDest, iP
14b50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20 30  arm, brk, brk, 0
14b60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14b70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
14b80 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  brk);.  sqlite3V
14b90 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
14ba0 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  lose, base, 0);.
14bb0 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d    .  return 1;.}
14bc0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
14bd0 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72 20  and ORDER BY or 
14be0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
14bf0 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
14c00 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a  ement.  Return.*
14c10 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
14c20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a 0a  errors seen..**.
14c30 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f  ** An ORDER BY o
14c40 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61 20  r GROUP BY is a 
14c50 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
14c60 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78 70  ons.  If any exp
14c70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61 6e  ression.** is an
14c80 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
14c90 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78 70  t, then that exp
14ca0 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c 61  ression is repla
14cb0 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 6f  ced by the.** co
14cc0 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74 72  rresponding entr
14cd0 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  y in the result 
14ce0 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
14cf0 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47  nt processOrderG
14d00 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f  roupBy(.  NameCo
14d10 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
14d20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
14d30 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
14d40 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45 78  atement. */.  Ex
14d50 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
14d60 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
14d70 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
14d80 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
14d90 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  cessed */.  cons
14da0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
14db0 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44    /* Either "ORD
14dc0 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20  ER" or "GROUP", 
14dd0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  as appropriate *
14de0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
14df0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
14e00 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 20   = pNC->pEList; 
14e10 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
14e20 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
14e30 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  ECT */.  Parse *
14e40 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
14e50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  arse;     /* The
14e60 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
14e70 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 61  he SELECT */.  a
14e80 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29 3b  ssert( pEList );
14e90 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
14ea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
14eb0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
14ec0 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d 41 58  nExpr>SQLITE_MAX
14ed0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 73  _COLUMN ){.    s
14ee0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14ef0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
14f00 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20   terms in %s BY 
14f10 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b  clause", zType);
14f20 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14f30 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
14f40 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
14f50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
14f60 43 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Col;.    Expr *p
14f70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
14f80 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
14f90 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
14fa0 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
14fb0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
14fc0 43 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70  Col>0 && iCol<=p
14fd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
14fe0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
14ff0 2a 70 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f  *pColl = pE->pCo
15000 6c 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ll;.        int 
15010 66 6c 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67  flags = pE->flag
15020 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
15030 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
15040 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 29  e3ExprDelete(pE)
15050 3b 0a 20 20 20 20 20 20 20 20 70 45 20 3d 20 70  ;.        pE = p
15060 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
15070 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
15080 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69  rDup(pEList->a[i
15090 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20  Col-1].pExpr);. 
150a0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
150b0 20 26 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20   && flags ){.   
150c0 20 20 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c         pE->pColl
150d0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
150e0 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d      pE->flags |=
150f0 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
15100 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
15110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15120 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15130 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20 42             "%s B
15140 59 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  Y column number 
15150 25 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  %d out of range 
15160 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
15170 20 20 20 20 20 20 20 20 20 22 62 65 74 77 65 65           "betwee
15180 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79  n 1 and %d", zTy
15190 70 65 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74  pe, iCol, pEList
151a0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
151b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
151c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
151d0 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
151e0 6f 6c 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70  olveNames(pNC, p
151f0 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
15200 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
15210 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
15220 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15230 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e  e resolves any n
15240 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65  ames used in the
15250 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
15260 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53  he.** supplied S
15270 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
15280 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   If the SELECT s
15290 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
152a0 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20  esolved.** is a 
152b0 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e  sub-select, then
152c0 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70   pOuterNC is a p
152d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61  ointer to the Na
152e0 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66  meContext .** of
152f0 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45   the parent SELE
15300 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CT..*/.int sqlit
15310 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
15320 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15330 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
15340 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
15350 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
15360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15370 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15380 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
15390 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
153a0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
153b0 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63  The outer name c
153c0 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e  ontext. May be N
153d0 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ULL. */.){.  Exp
153e0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
153f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
15400 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  t set. */.  int 
15410 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15420 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f         /* For-lo
15430 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  op variable used
15440 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
15450 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ces */.  NameCon
15460 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
15470 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d      /* Local nam
15480 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e-context */.  E
15490 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
154a0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y;        /* The
154b0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
154c0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
154d0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
154e0 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
154f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
15500 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
15510 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
15520 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
15530 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15540 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
15550 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
15560 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
15570 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
15580 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
15590 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
155a0 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
155b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
155c0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
155d0 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
155e0 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
155f0 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
15600 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
15610 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
15620 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
15630 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
15640 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
15650 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
15660 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
15670 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
15680 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15690 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
156a0 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
156b0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
156c0 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
156d0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
156e0 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
156f0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
15700 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
15710 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
15720 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
15730 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
15740 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
15750 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
15760 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
15770 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
15780 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
15790 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
157a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
157b0 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
157c0 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a   p->pOffset) ){.
157d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
157e0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
157f0 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
15800 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
15810 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72   to pass to Expr
15820 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74  ResolveNames() t
15830 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74  o.  ** resolve t
15840 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  he expression-li
15850 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61  st..  */.  sNC.a
15860 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73  llowAgg = 1;.  s
15870 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
15880 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65  >pSrc;.  sNC.pNe
15890 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a  xt = pOuterNC;..
158a0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
158b0 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
158c0 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73   set. */.  pELis
158d0 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
158e0 20 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72   if( !pEList ) r
158f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15900 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  OR;.  for(i=0; i
15910 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
15920 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
15930 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
15940 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
15950 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
15960 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
15970 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  X) ){.      retu
15980 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
15990 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
159a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
159b0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
159c0 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
159d0 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
159e0 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78  ROUP BY .  ** ex
159f0 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
15a00 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
15a10 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
15a20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
15a30 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
15a40 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20  ( !p->isAgg );. 
15a50 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
15a60 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70  GroupBy;.  if( p
15a70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
15a80 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
15a90 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
15aa0 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
15ab0 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
15ac0 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
15ad0 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
15ae0 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
15af0 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
15b00 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
15b10 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
15b20 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
15b30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15b40 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
15b50 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
15b60 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
15b70 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72   HAVING");.    r
15b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15b90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  OR;.  }..  /* Ad
15ba0 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
15bb0 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
15bc0 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
15bd0 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a   parsing the.  *
15be0 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
15bf0 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
15c00 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
15c10 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a  s is so that.  *
15c20 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
15c30 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
15c40 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
15c50 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
15c60 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65  s by.  ** aliase
15c70 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
15c80 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  set..  **.  ** M
15c90 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
15ca0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
15cb0 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
15cc0 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  sion will be.  *
15cd0 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
15ce0 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
15cf0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
15d00 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
15d10 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
15d20 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
15d30 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
15d40 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73  Where) ||.     s
15d50 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
15d60 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
15d70 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
15d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15d90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
15da0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
15db0 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72     if( processOr
15dc0 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
15dd0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
15de0 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20 20  RDER") ||.      
15df0 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72    processOrderGr
15e00 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f  oupBy(&sNC, pGro
15e10 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 29  upBy, "GROUP") )
15e20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15e30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
15e40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
15e50 65 20 73 75 72 65 20 74 68 65 20 47 52 4f 55 50  e sure the GROUP
15e60 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
15e70 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
15e80 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
15e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47 72 6f  .  */.  if( pGro
15ea0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74 72 75  upBy ){.    stru
15eb0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
15ec0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 20 20   *pItem;.  .    
15ed0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
15ee0 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
15ef0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
15f00 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
15f10 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
15f20 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
15f30 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
15f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15f50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15f60 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
15f70 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
15f80 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
15f90 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
15fa0 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
15fb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15fc0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15fe0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6f   /* If this is o
15ff0 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63  ne SELECT of a c
16000 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75 72 65  ompound, be sure
16010 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65   to resolve name
16020 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 74  s.  ** in the ot
16030 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20 20 2a  her SELECTs..  *
16040 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
16050 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
16060 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
16070 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  olve(pParse, p->
16080 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72 4e 43  pPrior, pOuterNC
16090 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
160a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
160b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
160c0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
160d0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
160e0 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
160f0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
16100 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
16110 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
16120 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
16130 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
16140 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
16150 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
16160 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70  .** routine simp
16170 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  ly stores NULLs 
16180 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
16190 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f  memory cells..*/
161a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
161b0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
161c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
161d0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
161e0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
161f0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
16200 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
16210 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
16220 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  c;.  if( pAggInf
16230 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66  o->nFunc+pAggInf
16240 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b  o->nColumn==0 ){
16250 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
16260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
16270 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
16280 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
16290 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
162a0 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67 67 49  P_MemNull, pAggI
162b0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
162c0 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  m, 0);.  }.  for
162d0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
162e0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
162f0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
16300 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
16310 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16320 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c  dOp(v, OP_MemNul
16330 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 2c 20  l, pFunc->iMem, 
16340 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  0);.    if( pFun
16350 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
16360 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
16370 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
16380 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
16390 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
163a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
163b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
163c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
163d0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20  e, "DISTINCT in 
163e0 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62  aggregate must b
163f0 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20  e followed ".   
16400 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65          "by an e
16410 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
16420 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
16430 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
16440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16450 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16460 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
16470 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
16480 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20   pE->pList);.   
16490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
164a0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op3(v, OP_OpenEp
164b0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
164c0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 0a 20  iDistinct, 0, . 
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
164f0 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  pKeyInfo, P3_KEY
16500 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
16510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
16530 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
16540 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
16550 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
16560 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
16570 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
16580 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
16590 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
165a0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
165b0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
165c0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
165d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
165e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
165f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
16600 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
16610 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
16620 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
16630 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
16640 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
16650 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
16660 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
16670 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16680 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op3(v, OP_AggFin
16690 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
166a0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
166b0 70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  pr : 0,.        
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
166d0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
166e0 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P3_FUNCDEF);.  }
166f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
16700 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
16710 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
16720 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
16730 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
16740 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
16750 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
16760 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
16770 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
16780 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
16790 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
167a0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
167b0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
167c0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
167d0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
167e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
167f0 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
16800 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
16810 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
16820 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
16830 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
16840 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
16850 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
16860 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
16870 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   0;.    ExprList
16880 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
16890 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
168a0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
168b0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
168c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
168d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
168e0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
168f0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
16900 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b  .      nArg = 0;
16910 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16920 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
16930 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
16940 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
16950 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
16960 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
16970 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  =1 );.      code
16980 44 69 73 74 69 6e 63 74 28 76 2c 20 70 46 2d 3e  Distinct(v, pF->
16990 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
169a0 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ext, 1);.    }. 
169b0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
169c0 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
169d0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
169e0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
169f0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
16a00 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
16a10 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
16a20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
16a30 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
16a40 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 2d 3e  0 if pF->pFunc->
16a50 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73 20 74  needCollSeq is t
16a60 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  rue */.      for
16a70 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
16a80 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
16a90 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
16aa0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
16ab0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
16ac0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
16ad0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
16ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16af0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
16b00 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
16b10 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
16b20 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
16b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
16b40 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
16b50 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
16b60 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  oll, P3_COLLSEQ)
16b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16b80 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
16b90 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e 69 4d  _AggStep, pF->iM
16ba0 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69 64 2a  em, nArg, (void*
16bb0 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46  )pF->pFunc, P3_F
16bc0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 69 66 28  UNCDEF);.    if(
16bd0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
16be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16bf0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
16c00 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20  drNext);.    }. 
16c10 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43   }.  for(i=0, pC
16c20 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
16c30 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
16c40 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
16c50 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
16c60 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
16c70 65 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b 0a 20  e, pC->pExpr);. 
16c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16c90 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
16ca0 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20 31 29  re, pC->iMem, 1)
16cb0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
16cc0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
16cd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
16ce0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
16cf0 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73  e given SELECT s
16d00 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16d10 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16d20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
16d30 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
16d40 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
16d50 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74 20 61  value of eDest a
16d60 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  nd iParm..**.** 
16d70 20 20 20 20 65 44 65 73 74 20 56 61 6c 75 65 20      eDest Value 
16d80 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20        Result.** 
16d90 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16da0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
16db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16dd0 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c 6c 62  **     SRT_Callb
16de0 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20 74 68  ack    Invoke th
16df0 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 65  e callback for e
16e00 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
16e10 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  esult..**.**    
16e20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20   SRT_Mem        
16e30 20 53 74 6f 72 65 20 66 69 72 73 74 20 72 65 73   Store first res
16e40 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  ult in memory ce
16e50 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20  ll iParm.**.**  
16e60 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
16e70 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16e80 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61 62 6c   as keys of tabl
16e90 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  e iParm..**.**  
16ea0 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20     SRT_Union    
16eb0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
16ec0 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74   as a key in a t
16ed0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
16ee0 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  Parm.**.**     S
16ef0 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
16f00 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
16f10 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
16f20 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a   table iParm..**
16f30 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
16f40 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
16f50 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
16f60 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a  ry table iParm.*
16f70 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61  *.** The table a
16f80 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70 6c 65  bove is incomple
16f90 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20  te.  Additional 
16fa0 65 44 69 73 74 20 76 61 6c 75 65 20 68 61 76 65  eDist value have
16fb0 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73 69 6e   be added.** sin
16fc0 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20  ce this comment 
16fd0 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20 53 65  was written.  Se
16fe0 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e 6e 65  e the selectInne
16ff0 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69 6f 6e  rLoop() function
17000 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70 6c 65   for.** a comple
17010 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68  te listing of th
17020 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  e allowed values
17030 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20 74 68   of eDest and th
17040 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a 2a 2a  eir meanings..**
17050 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17060 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
17070 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
17080 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
17090 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
170a0 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
170b0 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
170c0 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
170d0 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
170e0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
170f0 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
17100 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
17110 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
17120 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
17130 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
17140 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
17150 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65 6e 74  *.** The pParent
17160 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61 6e 64  , parentTab, and
17170 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66 69 65   *pParentAgg fie
17180 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64 20 69  lds are filled i
17190 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53 45 4c  n if this.** SEL
171a0 45 43 54 20 69 73 20 61 20 73 75 62 71 75 65 72  ECT is a subquer
171b0 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
171c0 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f 6d 62   may try to comb
171d0 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43 54 0a  ine this SELECT.
171e0 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61 72 65  ** with its pare
171f0 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73 69 6e  nt to form a sin
17200 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79 2e 20  gle flat query. 
17210 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20 69 74   In so doing, it
17220 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e 67 65   might.** change
17230 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
17240 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61 67 67  y from a non-agg
17250 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61 67 67  regate to an agg
17260 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
17270 20 46 6f 72 20 74 68 61 74 20 72 65 61 73 6f 6e   For that reason
17280 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41 67 67  , the pParentAgg
17290 20 66 6c 61 67 20 69 73 20 70 61 73 73 65 64 20   flag is passed 
172a0 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20 73 6f  as a pointer, so
172b0 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68   it.** can be ch
172c0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  anged..**.** Exa
172d0 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20 6d 65  mple 1:   The me
172e0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 50 61  aning of the pPa
172f0 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  rent parameter..
17300 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
17310 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e 20 28  * FROM t1 JOIN (
17320 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
17330 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f 49 4e  *) FROM t2) JOIN
17340 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20 20 20   t3;.**    \    
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75    \_______ subqu
17370 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ery _______/    
17380 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c 20 20      /.**     \  
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 5c 5f      /.**      \_
173d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
173e0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
173f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17400 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ___/.**.** This 
17410 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17420 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65 72 20  d for the outer 
17430 71 75 65 72 79 20 66 69 72 73 74 2e 20 20 20 46  query first.   F
17440 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a 2a 2a  or that call,.**
17450 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 62 65   pParent will be
17460 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67 20 74   NULL.  During t
17470 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  he processing of
17480 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17490 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75 74 69  , this .** routi
174a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ne is called rec
174b0 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61 6e 64  ursively to hand
174c0 6c 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  le the subquery.
174d0 20 20 46 6f 72 20 74 68 65 20 72 65 63 75 72 73    For the recurs
174e0 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70 50 61  ive.** call, pPa
174f0 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e 74 20  rent will point 
17500 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
17510 72 79 2e 20 20 42 65 63 61 75 73 65 20 74 68 65  ry.  Because the
17520 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a 2a 20   subquery is.** 
17530 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
17540 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d 77 61  nt in a three-wa
17550 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61 72 65  y join, the pare
17560 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65 72 20  ntTab parameter 
17570 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28 74 68  will.** be 1 (th
17580 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66 20 61  e 2nd value of a
17590 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72 61 79   0-indexed array
175a0 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  .).*/.int sqlite
175b0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
175c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
175d0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
175e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
175f0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17600 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
17610 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
17620 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 69 6e  g coded. */.  in
17630 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20 20  t eDest,        
17640 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
17650 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
17660 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
17670 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Parm,           
17680 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74 65 72    /* A parameter
17690 20 75 73 65 64 20 62 79 20 74 68 65 20 65 44 65   used by the eDe
176a0 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  st disposal meth
176b0 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  od */.  Select *
176c0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 2f  pParent,       /
176d0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
176e0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
176f0 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20 2a  is a sub-query *
17700 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54 61  /.  int parentTa
17710 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  b,         /* In
17720 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  dex in pParent->
17730 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75 65  pSrc of this que
17740 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 61  ry */.  int *pPa
17750 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20 20 2f  rentAgg,       /
17760 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
17770 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  t uses aggregate
17780 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
17790 63 68 61 72 20 2a 61 66 66 20 20 20 20 20 20 20  char *aff       
177a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44 65         /* If eDe
177b0 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 2c  st is SRT_Union,
177c0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
177d0 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ring */.){.  int
177e0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
177f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17800 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
17810 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
17820 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
17830 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
17840 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
17850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17860 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
17870 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
17880 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
17890 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
178a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
178b0 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
178c0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
178d0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
178e0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
178f0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
17900 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
17910 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
17920 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
17930 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
17940 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
17950 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
17960 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
17970 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
17980 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
17990 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
179a0 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
179b0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
179c0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
179d0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
179e0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
179f0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
17a00 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
17a10 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
17a20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
17a30 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
17a40 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
17a50 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
17a60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
17a70 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
17a80 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
17a90 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
17aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17ab0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
17ac0 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
17ad0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
17ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
17af0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
17b00 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
17b10 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
17b20 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
17b30 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
17b40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
17b50 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
17b60 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
17b70 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
17b80 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
17b90 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
17ba0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
17bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
17bc0 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
17bd0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
17be0 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ..  if( p==0 || 
17bf0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
17c00 6c 65 64 28 29 20 7c 7c 20 70 50 61 72 73 65 2d  led() || pParse-
17c10 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
17c20 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
17c30 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17c40 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17c50 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
17c60 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
17c70 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
17c80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
17c90 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  Info));..#ifndef
17ca0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
17cb0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
17cc0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
17cd0 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
17ce0 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
17cf0 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
17d00 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
17d10 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
17d20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
17d30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
17d40 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  lect *pLoop;.   
17d50 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
17d60 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
17d70 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
17d80 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67       pLoop->pRig
17d90 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20  htmost = p;.    
17da0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
17db0 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
17dc0 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73  (pParse, p, eDes
17dd0 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b 0a  t, iParm, aff);.
17de0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 4f    }.#endif..  pO
17df0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
17e00 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
17e10 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65  rableOrderby(eDe
17e20 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
17e30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
17e40 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
17e50 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73  ectResolve(pPars
17e60 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, p, 0) ){.    
17e70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
17e80 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72  .  }.  p->pOrder
17e90 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a  By = pOrderBy;..
17ea0 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20    /* Make local 
17eb0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
17ec0 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69  rameters for thi
17ed0 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  s query..  */.  
17ee0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
17ef0 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70  rc;.  pWhere = p
17f00 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
17f10 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
17f20 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
17f30 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
17f40 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a  Agg = p->isAgg;.
17f50 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70    isDistinct = p
17f60 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
17f70 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
17f80 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
17f90 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
17fa0 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
17fb0 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
17fc0 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
17fd0 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
17fe0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
17ff0 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
18000 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
18010 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
18020 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
18030 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
18040 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49  ect_end;..  /* I
18050 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d  f writing to mem
18060 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e  ory or generatin
18070 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c  g a set.  ** onl
18080 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  y a single colum
18090 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e  n may be output.
180a0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
180b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
180c0 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  RY.  if( checkFo
180d0 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
180e0 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
180f0 65 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  eDest, pEList->n
18100 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74  Expr) ){.    got
18110 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18120 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  }.#endif..  /* O
18130 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
18140 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
18150 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
18160 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
18170 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
18180 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
18190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
181a0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
181b0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
181c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
181d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
181e0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
181f0 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  nd;..  /* Genera
18200 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
18210 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
18220 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
18230 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
18240 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
18250 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
18260 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
18270 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
18280 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
18290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
182a0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
182b0 74 68 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20  thContext = 0;. 
182c0 20 20 20 69 6e 74 20 6e 65 65 64 52 65 73 74 6f     int needResto
182d0 72 65 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73  reContext;.    s
182e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
182f0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
18300 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20  bList->a[i];..  
18310 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
18320 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d  lect==0 || pItem
18330 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20  ->isPopulated ) 
18340 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
18350 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  ( pItem->zName!=
18360 30 20 29 7b 0a 20 20 20 20 20 20 7a 53 61 76 65  0 ){.      zSave
18370 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
18380 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
18390 65 78 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73  ext;.      pPars
183a0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
183b0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
183c0 20 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72        needRestor
183d0 65 43 6f 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20  eContext = 1;.  
183e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
183f0 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78  eedRestoreContex
18400 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 69 66  t = 0;.    }.#if
18410 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
18420 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 2f 2a 20  _DEPTH>0.    /* 
18430 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e  Increment Parse.
18440 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68  nHeight by the h
18450 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72  eight of the lar
18460 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  gest expression.
18470 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65      ** tree refe
18480 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
18490 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
184a0 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
184b0 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
184c0 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
184d0 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
184e0 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
184f0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
18500 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
18510 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
18520 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
18530 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
18540 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
18550 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
18560 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
18570 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
18580 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
18590 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
185a0 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
185b0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 23  ExprHeight(p);.#
185c0 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
185d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
185e0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
185f0 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 0a 20  SRT_EphemTab, . 
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  pItem->iCursor, 
18620 70 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29  p, i, &isAgg, 0)
18630 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
18640 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
18650 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
18660 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
18670 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
18680 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
18690 6e 65 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65  needRestoreConte
186a0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  xt ){.      pPar
186b0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
186c0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
186d0 74 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  text;.    }.    
186e0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
186f0 72 63 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  rc;.    pWhere =
18700 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
18710 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
18720 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
18730 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
18740 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
18750 20 20 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79    }.    pGroupBy
18760 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
18770 20 20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d      pHaving = p-
18780 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73  >pHaving;.    is
18790 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
187a0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65  Distinct;.  }.#e
187b0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
187c0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c   for the special
187d0 20 63 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29   case of a min()
187e0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
187f0 6f 6e 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a  on by itself.  *
18800 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
18810 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
18820 73 69 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72  simpleMinMaxQuer
18830 79 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  y(pParse, p, eDe
18840 73 74 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20  st, iParm) ){.  
18850 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f    rc = 0;.    go
18860 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18870 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
18880 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73  o see if this is
18890 20 61 20 73 75 62 71 75 65 72 79 20 74 68 61 74   a subquery that
188a0 20 63 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e   can be "flatten
188b0 65 64 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72  ed" into its par
188c0 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61  ent..  ** If fla
188d0 74 74 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73  ttening is a pos
188e0 73 69 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61  siblity, do so a
188f0 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
18900 61 74 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69  ately.  .  */.#i
18910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18920 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 50 61  T_VIEW.  if( pPa
18930 72 65 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41  rent && pParentA
18940 67 67 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74  gg &&.      flat
18950 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
18960 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
18970 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41  *pParentAgg, isA
18980 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69  gg) ){.    if( i
18990 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41  sAgg ) *pParentA
189a0 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  gg = 1;.    goto
189b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
189c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
189d0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
189e0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
189f0 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
18a00 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
18a10 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
18a20 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
18a30 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
18a40 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
18a50 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
18a60 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
18a70 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
18a80 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
18a90 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
18aa0 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
18ab0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
18ac0 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
18ad0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
18ae0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
18af0 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
18b00 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
18b10 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
18b20 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
18b30 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
18b40 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
18b50 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
18b60 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
18b70 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
18b80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
18b90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18ba0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
18bb0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
18bc0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
18bd0 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
18be0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
18bf0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
18c00 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
18c10 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
18c20 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
18c30 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
18c40 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
18c50 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  l, pOrderBy->iEC
18c60 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
18c70 3e 6e 45 78 70 72 2b 32 2c 20 20 20 20 20 20 20  >nExpr+2,       
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
18c90 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
18ca0 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
18cb0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
18cc0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
18cd0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
18ce0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
18cf0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
18d00 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
18d10 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
18d20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
18d30 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
18d40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18d50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
18d60 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61  enEphemeral, iPa
18d70 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
18d80 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
18d90 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
18da0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
18db0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18dc0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
18dd0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
18de0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
18df0 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
18e00 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
18e10 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
18e20 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
18e30 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
18e40 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
18e50 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74  eyInfo;.    dist
18e60 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
18e70 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
18e80 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
18e90 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
18ea0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
18eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
18ec0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18ed0 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20  eral, distinct, 
18ee0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
18ef0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18f00 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
18f10 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
18f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
18f30 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
18f40 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
18f50 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
18f60 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
18f70 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
18f80 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
18f90 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
18fa0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
18fb0 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
18fc0 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
18fd0 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
18fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
18ff0 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
19000 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
19010 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
19020 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
19030 65 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20  e, &pOrderBy);. 
19040 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
19050 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
19060 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
19070 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
19080 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
19090 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
190a0 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
190b0 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
190c0 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
190d0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
190e0 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
190f0 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
19100 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
19110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19120 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
19130 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
19140 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19150 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
19160 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
19170 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
19180 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
19190 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
191a0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
191b0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
191c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
191d0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
191e0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
191f0 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
19200 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
19210 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
19220 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
19230 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
19240 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
19250 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
19260 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19270 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19280 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
19290 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
192a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
192b0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
192c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
192d0 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
192e0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
192f0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
19300 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
19310 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
19320 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
19330 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
19340 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
19350 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
19360 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
19370 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
19380 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
19390 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
193a0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
193b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
193c0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
193d0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
193e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
193f0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
19400 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
19410 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
19420 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
19450 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
19460 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
19470 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
194a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
194b0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
194c0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
194d0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
194e0 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
194f0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
19500 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
19510 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
19520 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
19530 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
19540 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
19550 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
19560 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
19570 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
19580 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
19590 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
195a0 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
195b0 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
195c0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
195d0 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
195e0 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
195f0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
19600 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
19610 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
19620 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
19630 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
19640 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
19650 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
19660 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
19670 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
19680 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
19690 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
196a0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
196b0 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
196c0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
196d0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
196e0 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
196f0 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
19700 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
19710 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
19720 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
19730 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
19740 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
19750 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
19760 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
19770 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
19780 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
19790 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
197a0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
197b0 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
197c0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
197d0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
197e0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
197f0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
19800 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75  ;          /* Su
19810 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
19820 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
19830 75 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61  ulator */..    a
19840 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
19850 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
19860 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
19870 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
19880 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
19890 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
198a0 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
198b0 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
198c0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
198d0 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
198e0 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
198f0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
19900 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
19910 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
19920 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
19930 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
19940 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
19950 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
19960 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
19970 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
19980 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
19990 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
199a0 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
199b0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
199c0 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
199d0 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
199e0 70 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBy;.    if( sql
199f0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19a00 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
19a10 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ist) ){.      go
19a20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19a30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
19a40 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
19a50 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72  ggList(&sNC, pOr
19a60 64 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20  derBy) ){.      
19a70 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
19a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19a90 48 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65  Having && sqlite
19aa0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
19ab0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
19ac0 76 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67  ving) ){.      g
19ad0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
19ae0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
19af0 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
19b00 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
19b10 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
19b20 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
19b30 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; i++){.      i
19b40 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  f( sqlite3ExprAn
19b50 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
19b60 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
19b70 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73  c[i].pExpr->pLis
19b80 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  t) ){.        go
19b90 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
19ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19bb0 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
19bc0 6f 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74  ocFailed() ) got
19bd0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
19be0 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67     /* Processing
19bf0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20   for aggregates 
19c00 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73  with GROUP BY is
19c10 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20   very different 
19c20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20  and.    ** much 
19c30 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61  more complex tha
19c40 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
19c50 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
19c60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19c70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
19c80 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19c90 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
19ca0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
19cb0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
19cc0 73 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  se */..      /* 
19cd0 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68  Create labels th
19ce0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65  at we will be ne
19cf0 65 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  eding.      */. 
19d00 20 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49      .      addrI
19d10 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20  nitializeLoop = 
19d20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19d30 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
19d40 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65  ddrGroupByChange
19d50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19d60 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
19d70 20 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77    addrProcessRow
19d80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19d90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
19da0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
19db0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
19dc0 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
19dd0 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
19de0 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
19df0 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
19e00 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
19e10 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
19e20 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
19e30 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
19e40 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
19e50 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70  fter all, the Op
19e60 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
19e70 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
19e80 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
19e90 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
19ea0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
19eb0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
19ec0 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
19ed0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
19ee0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
19ef0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
19f00 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20  se, pGroupBy);. 
19f10 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
19f20 49 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  Idx =.          
19f30 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
19f40 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
19f50 61 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  al, sAggInfo.sor
19f60 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
19f90 69 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ingColumn,.     
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fb0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
19fc0 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  nfo, P3_KEYINFO_
19fd0 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20  HANDOFF);..     
19fe0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
19ff0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
1a000 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59  used by GROUP BY
1a010 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65   aggregate proce
1a020 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20  ssing.      */. 
1a030 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20       iUseFlag = 
1a040 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
1a050 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67        iAbortFlag
1a060 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1a070 2b 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d  +;.      iAMem =
1a080 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
1a090 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
1a0a0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
1a0b0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
1a0c0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
1a0d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1a0e0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
1a0f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
1a100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a110 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
1a120 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
1a130 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a140 28 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f  (v, "# clear abo
1a150 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
1a160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a170 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
1a180 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
1a190 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a1a0 28 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65  ((v, "# indicate
1a1b0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
1a1c0 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
1a1d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a1e0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
1a1f0 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29  rInitializeLoop)
1a200 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
1a210 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1a220 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
1a230 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
1a240 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1a250 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
1a260 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
1a270 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
1a280 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
1a290 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
1a2a0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1a2b0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
1a2c0 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
1a2d0 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
1a2e0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
1a2f0 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
1a300 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
1a310 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
1a320 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
1a330 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
1a340 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
1a350 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
1a360 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
1a370 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
1a380 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
1a390 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
1a3a0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
1a3b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1a3c0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1a3d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a3e0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
1a3f0 74 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  t, 1, iAbortFlag
1a400 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1a410 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20  ment((v, "# set 
1a420 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
1a430 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a440 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
1a450 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
1a460 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
1a470 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a480 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1a490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a4a0 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
1a4b0 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
1a4c0 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
1a4d0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a4e0 28 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20  ((v, "# Groupby 
1a4f0 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
1a500 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b   entry point"));
1a510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a520 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
1a530 74 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  turn, 0, 0);.   
1a540 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
1a550 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
1a560 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
1a570 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1a580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a590 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1a5a0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1a5b0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29  rOutputRow+1, 1)
1a5c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a5d0 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72  rc = selectInner
1a5e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1a5f0 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
1a600 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20        distinct, 
1a630 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20  eDest, iParm, . 
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
1a660 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
1a670 65 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20  etAbort, aff);. 
1a680 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1a690 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
1a6a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
1a6b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a6c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1a6d0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
1a6e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1a6f0 2c 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79  , "# end groupby
1a700 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
1a710 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1a720 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1a730 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
1a740 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
1a750 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
1a760 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1a770 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
1a780 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a790 28 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  (v);.      reset
1a7a0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
1a7b0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
1a7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a7d0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
1a7e0 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  urn, 0, 0);..   
1a7f0 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
1a800 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
1a810 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
1a820 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
1a830 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
1a840 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
1a850 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
1a860 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
1a870 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
1a880 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
1a890 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
1a8a0 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
1a8b0 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
1a8c0 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
1a8d0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
1a8e0 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
1a8f0 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
1a900 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1a910 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a920 61 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74  abel(v, addrInit
1a930 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20  ializeLoop);.   
1a940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a950 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1a960 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1a970 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
1a980 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1a990 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
1a9a0 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
1a9b0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28  upBy);.      if(
1a9c0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1a9d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1a9e0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
1a9f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1aa00 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
1aa10 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
1aa20 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
1aa30 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
1aa40 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
1aa50 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
1aa60 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
1aa70 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
1aa80 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
1aa90 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
1aaa0 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
1aab0 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
1aac0 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
1aad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f   */.        pGro
1aae0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1aaf0 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75  By;.        grou
1ab00 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
1ab10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ab20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
1ab30 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
1ab40 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
1ab50 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
1ab60 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
1ab70 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
1ab80 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
1ab90 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
1aba0 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
1abb0 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
1abc0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
1abd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
1abe0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1abf0 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
1ac00 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
1ac10 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
1ac20 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
1ac30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ac40 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
1ac50 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
1ac60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ac70 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71  eAddOp(v, OP_Seq
1ac80 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
1ac90 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1aca0 20 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f          j = pGro
1acb0 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20  upBy->nExpr+1;. 
1acc0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1acd0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
1ace0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
1acf0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
1ad00 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
1ad10 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
1ad20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ad30 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1ad40 75 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65  umn<j ) continue
1ad50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ad60 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
1ad70 6c 75 6d 6e 28 76 2c 20 70 43 6f 6c 2d 3e 70 54  lumn(v, pCol->pT
1ad80 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
1ad90 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 29  n, pCol->iTable)
1ada0 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  ;.          j++;
1adb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1adc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1add0 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
1ade0 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20 20 20  cord, j, 0);.   
1adf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ae00 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
1ae10 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
1ae20 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a  sortingIdx, 0);.
1ae30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1ae40 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
1ae50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae60 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1ae70 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
1ae80 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
1ae90 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
1aea0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1aeb0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
1aec0 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
1aed0 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
1aee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
1aef0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
1af00 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
1af10 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
1af20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
1af30 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
1af40 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
1af50 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
1af60 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
1af70 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
1af80 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
1af90 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
1afa0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
1afb0 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
1afc0 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
1afd0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
1afe0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
1aff0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
1b000 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
1b010 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
1b020 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
1b030 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b040 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  v);.      for(j=
1b050 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1b060 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1b070 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
1b080 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
1b090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b0a0 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
1b0b0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1b0c0 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Idx, j);.       
1b0d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b0e0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
1b0f0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
1b100 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b110 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
1b120 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
1b130 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1b140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b150 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1b160 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a 2c 20  Store, iBMem+j, 
1b170 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1b180 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r-1);.      }.  
1b190 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f 75 70      for(j=pGroup
1b1a0 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a 3e 3d  By->nExpr-1; j>=
1b1b0 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; j--){.       
1b1c0 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42 79 2d   if( j<pGroupBy-
1b1d0 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
1b1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b1f0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
1b200 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c 20 30  Load, iBMem+j, 0
1b210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b230 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
1b240 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20 30 29  oad, iAMem+j, 0)
1b250 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  ;.        if( j=
1b260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b280 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32 30 30  (v, OP_Eq, 0x200
1b290 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77  , addrProcessRow
1b2a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1b2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1b2c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1b2d0 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20 61 64  OP_Ne, 0x200, ad
1b2e0 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
1b2f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1b310 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 28  hangeP3(v, -1, (
1b320 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2d 3e  void*)pKeyInfo->
1b330 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43 4f 4c  aColl[j], P3_COL
1b340 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LSEQ);.      }..
1b350 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b360 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
1b370 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
1b380 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
1b390 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 20        ** Change 
1b3a0 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
1b3b0 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
1b3c0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
1b3d0 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
1b3e0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
1b3f0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
1b400 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
1b410 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1b420 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
1b430 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
1b440 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
1b450 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
1b460 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
1b470 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
1b480 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
1b490 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
1b4a0 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
1b4b0 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
1b4c0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
1b4d0 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
1b4e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
1b4f0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
1b500 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
1b510 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1b520 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b530 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70 42 79  l(v, addrGroupBy
1b540 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 66  Change);.      f
1b550 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
1b560 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
1b570 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b580 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b590 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d 2b 6a  MemMove, iAMem+j
1b5a0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
1b5b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1b5c0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1b5d0 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f  _Gosub, 0, addrO
1b5e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
1b5f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b600 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65 20 72   "# output one r
1b610 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ow"));.      sql
1b620 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1b630 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 41   OP_IfMemPos, iA
1b640 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
1b650 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
1b660 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63 68 65  mment((v, "# che
1b670 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
1b680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1b690 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
1b6a0 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52 65 73  osub, 0, addrRes
1b6b0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
1b6c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 65  omment((v, "# re
1b6d0 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
1b6e0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
1b6f0 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
1b700 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
1b710 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
1b720 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
1b730 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1b740 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b750 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b760 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 50  veLabel(v, addrP
1b770 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
1b780 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
1b790 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1b7a0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
1b7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1b7c0 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
1b7d0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1b7e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1b7f0 20 22 23 20 69 6e 64 69 63 61 74 65 20 64 61 74   "# indicate dat
1b800 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
1b810 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
1b820 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
1b830 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1b840 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
1b850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b860 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1b870 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
1b880 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
1b890 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
1b8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b8b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1b8c0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
1b8d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1b8e0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
1b8f0 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
1b900 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1b910 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
1b920 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
1b930 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b950 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
1b960 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
1b970 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1b980 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70 75 74  nt((v, "# output
1b990 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 20   final row"));. 
1b9a0 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
1b9b0 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f  ndif pGroupBy */
1b9c0 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
1b9d0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
1b9e0 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
1b9f0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
1ba00 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
1ba10 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  e.      ** proce
1ba20 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
1ba30 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
1ba40 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
1ba50 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20  le row.      ** 
1ba60 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
1ba70 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41   */.      resetA
1ba80 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
1ba90 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1baa0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
1bab0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1bac0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1bad0 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
1bae0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
1baf0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1bb00 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64 61 74  end;.      updat
1bb10 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1bb20 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1bb30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
1bb40 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
1bb50 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
1bb60 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
1bb70 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
1bb80 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1bb90 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  0;.      if( pHa
1bba0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
1bbb0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1bbc0 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
1bbd0 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31 29 3b  ng, addrEnd, 1);
1bbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1bbf0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1bc00 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
1bc10 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
1bc20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1bc30 20 20 20 20 20 20 20 20 20 65 44 65 73 74 2c 20           eDest, 
1bc40 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64 2c 20  iParm, addrEnd, 
1bc50 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b 0a 20  addrEnd, aff);. 
1bc60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1bc70 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1bc80 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
1bc90 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
1bca0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
1bcb0 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  */..  /* If ther
1bcc0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1bcd0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65   clause, then we
1bce0 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68   need to sort th
1bcf0 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61  e results.  ** a
1bd00 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20  nd send them to 
1bd10 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65  the callback one
1bd20 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20   by one..  */.  
1bd30 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1bd40 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
1bd50 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
1bd60 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
1bd70 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 3b  , eDest, iParm);
1bd80 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1bd90 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1bda0 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  RY.  /* If this 
1bdb0 77 61 73 20 61 20 73 75 62 71 75 65 72 79 2c 20  was a subquery, 
1bdc0 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f 6e 76  we have now conv
1bdd0 65 72 74 65 64 20 74 68 65 20 73 75 62 71 75 65  erted the subque
1bde0 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74  ry into a.  ** t
1bdf0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1be00 20 53 6f 20 73 65 74 20 74 68 65 20 53 72 63 4c   So set the SrcL
1be10 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70 75 6c  ist_item.isPopul
1be20 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70 72 65  ated flag to pre
1be30 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73 20 73  vent.  ** this s
1be40 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62 65 69  ubquery from bei
1be50 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61 67 61  ng evaluated aga
1be60 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63 65 20  in and to force 
1be70 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a 2a 20  the use of.  ** 
1be80 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1be90 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1bea0 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 61  pParent ){.    a
1beb0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1bec0 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72 65 6e  pSrc->nSrc>paren
1bed0 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73 73 65  tTab );.    asse
1bee0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  rt( pParent->pSr
1bef0 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1bf00 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a 20 20  pSelect==p );.  
1bf10 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d    pParent->pSrc-
1bf20 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e 69 73  >a[parentTab].is
1bf30 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20  Populated = 1;. 
1bf40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1bf50 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
1bf60 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
1bf70 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1bf80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
1bf90 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
1bfa0 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
1bfb0 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
1bfc0 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
1bfd0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
1bfe0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
1bff0 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
1c000 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
1c010 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
1c020 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
1c030 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
1c040 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
1c050 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
1c060 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
1c070 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
1c080 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  :..  /* Identify
1c090 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
1c0a0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e   we will be usin
1c0b0 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c  g them in a call
1c0c0 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a  back.  This.  **
1c0d0 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65 64   step is skipped
1c0e0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
1c0f0 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20  s going to some 
1c100 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f  other destinatio
1c110 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  n..  */.  if( rc
1c120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1c130 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
1c140 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ck ){.    genera
1c150 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
1c160 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1c170 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
1c180 73 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49  sqliteFree(sAggI
1c190 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
1c1a0 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f  iteFree(sAggInfo
1c1b0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
1c1c0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
1c1d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1c1e0 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
1c1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c230 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
1c240 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
1c250 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
1c260 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
1c270 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
1c280 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
1c290 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1c2a0 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
1c2b0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
1c2c0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
1c2d0 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
1c2e0 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
1c2f0 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
1c300 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
1c310 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
1c320 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
1c330 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
1c340 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
1c350 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
1c360 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
1c370 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
1c380 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
1c390 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
1c3a0 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
1c3b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
1c3c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1c3d0 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
1c3e0 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
1c3f0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
1c400 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
1c410 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
1c420 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
1c430 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
1c440 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
1c450 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
1c460 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
1c470 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
1c480 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
1c490 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
1c4a0 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
1c4b0 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
1c4c0 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30   && p->token.n>0
1c4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1c4e0 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a  ebugPrintf("(%.*
1c4f0 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  s", p->token.n, 
1c500 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d  p->token.z);.  }
1c510 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1c520 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
1c530 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a  d", p->op);.  }.
1c540 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
1c550 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
1c560 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
1c570 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
1c580 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  xpr(p->pLeft);. 
1c590 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67   }.  if( p->pRig
1c5a0 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
1c5b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
1c5c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1c5d0 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68  intExpr(p->pRigh
1c5e0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
1c5f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22  3DebugPrintf(")"
1c600 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
1c610 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45  3PrintExprList(E
1c620 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1c630 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1c640 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1c650 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
1c660 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
1c670 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1c680 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c  r);.    if( i<pL
1c690 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
1c6a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1c6b0 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a  ugPrintf(", ");.
1c6c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
1c6d0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
1c6e0 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
1c6f0 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
1c700 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1c710 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
1c720 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
1c730 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
1c740 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
1c750 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
1c760 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
1c770 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
1c780 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
1c790 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
1c7a0 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
1c7b0 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
1c7c0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
1c7d0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1c7e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1c7f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1c800 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
1c810 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1c820 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
1c830 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
1c840 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
1c850 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
1c860 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1c870 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c880 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1c890 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
1c8a0 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
1c8b0 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
1c8c0 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
1c8d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1c8e0 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
1c8f0 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
1c900 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1c910 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
1c920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1c930 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
1c940 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1c950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c960 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
1c970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1c980 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
1c990 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
1c9a0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
1c9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c9c0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
1c9d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c9e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
1c9f0 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
1ca00 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
1ca10 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
1ca20 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
1ca30 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1ca40 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
1ca50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1ca60 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ca70 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
1ca80 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1ca90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1caa0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
1cab0 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
1cac0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
1cad0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
1cae0 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
1caf0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
1cb00 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
1cb10 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
1cb20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1cb30 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
1cb40 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
1cb50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1cb60 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
1cb70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
1cb80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1cb90 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
1cba0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
1cbb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1cbc0 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
1cbd0 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
1cbe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
1cbf0 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
1cc00 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
1cc10 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1cc20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1cc30 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1cc40 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1cc50 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
1cc60 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
1cc70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
1cc80 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
1cc90 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
1cca0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1ccb0 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
1ccc0 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
1ccd0 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
1cce0 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
1ccf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cd30 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
1cd40 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cd50 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
1cd60 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
1cd70 2f 0a                                            /.