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

Artifact 380fa06c99ae01050c0054c4b1db91e9f1d8322d:


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 31 38  select.c,v 1.318
0200: 20 32 30 30 36 2f 30 36 2f 32 31 20 30 37 3a 30   2006/06/21 07:0
0210: 32 3a 33 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  2:33 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 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
08b0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
08c0: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
08d0: 70 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d  pOffset;.  pNew-
08e0: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
08f0: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
0900: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
0910: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
0920: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0930: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
0940: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0950: 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[2] = -1;.  
0960: 69 66 28 20 70 4e 65 77 3d 3d 26 73 74 61 6e 64  if( pNew==&stand
0970: 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  in) {.    clearS
0980: 65 6c 65 63 74 28 70 4e 65 77 29 3b 0a 20 20 20  elect(pNew);.   
0990: 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20   pNew = 0;.  }. 
09a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
09b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
09c0: 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73  e given Select s
09d0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
09e0: 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63   of its substruc
09f0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
0a00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
0a10: 74 65 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  te(Select *p){. 
0a20: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 6c   if( p ){.    cl
0a30: 65 61 72 53 65 6c 65 63 74 28 70 29 3b 0a 20 20  earSelect(p);.  
0a40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b    sqliteFree(p);
0a50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
0a60: 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74  ven 1 to 3 ident
0a70: 69 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e  ifiers preceedin
0a80: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
0a90: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
0aa0: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
0ab0: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
0ac0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
0ad0: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
0ae0: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
0af0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
0b00: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
0b10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
0b20: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
0b30: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
0b40: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
0b50: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
0b60: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
0b70: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
0b80: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
0b90: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
0ba0: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
0bb0: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
0bc0: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
0bd0: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
0be0: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
0bf0: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
0c00: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
0c10: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
0c20: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
0c30: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
0c40: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
0c50: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
0c60: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
0c70: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
0c80: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
0c90: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
0ca0: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
0cb0: 6e 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63  n *p;.  static c
0cc0: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
0cd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65    const char zKe
0ce0: 79 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38  yword[8];.    u8
0cf0: 20 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63   nChar;.    u8 c
0d00: 6f 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64  ode;.  } keyword
0d10: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e  s[] = {.    { "n
0d20: 61 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e  atural", 7, JT_N
0d30: 41 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20  ATURAL },.    { 
0d40: 22 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54  "left",    4, JT
0d50: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  _LEFT|JT_OUTER }
0d60: 2c 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c  ,.    { "right",
0d70: 20 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a     5, JT_RIGHT|J
0d80: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0d90: 20 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a   "full",    4, J
0da0: 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c  T_LEFT|JT_RIGHT|
0db0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0dc0: 7b 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20  { "outer",   5, 
0dd0: 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20  JT_OUTER },.    
0de0: 7b 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20  { "inner",   5, 
0df0: 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20  JT_INNER },.    
0e00: 7b 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20  { "cross",   5, 
0e10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53  JT_INNER|JT_CROS
0e20: 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  S },.  };.  int 
0e30: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
0e40: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
0e50: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
0e60: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
0e70: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
0e80: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
0e90: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
0ea0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65   for(j=0; j<size
0eb0: 6f 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a  of(keywords)/siz
0ec0: 65 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29  eof(keywords[0])
0ed0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
0ee0: 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73  ( p->n==keywords
0ef0: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
0f00: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
0f10: 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
0f20: 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d  ->z, keywords[j]
0f30: 2e 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29  .zKeyword, p->n)
0f40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
0f50: 6f 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f  ointype |= keywo
0f60: 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  rds[j].code;.   
0f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0f80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
0f90: 28 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77  ( j>=sizeof(keyw
0fa0: 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79  ords)/sizeof(key
0fb0: 77 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20  words[0]) ){.   
0fc0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a     jointype |= J
0fd0: 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  T_ERROR;.      b
0fe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
0ff0: 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e    if(.     (join
1000: 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52  type & (JT_INNER
1010: 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54  |JT_OUTER))==(JT
1020: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1030: 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79   ||.     (jointy
1040: 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d  pe & JT_ERROR)!=
1050: 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  0.  ){.    const
1060: 20 63 68 61 72 20 2a 7a 53 70 31 20 3d 20 22 20   char *zSp1 = " 
1070: 22 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ";.    const cha
1080: 72 20 2a 7a 53 70 32 20 3d 20 22 20 22 3b 0a 20  r *zSp2 = " ";. 
1090: 20 20 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 20     if( pB==0 ){ 
10a0: 7a 53 70 31 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  zSp1++; }.    if
10b0: 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 32 2b  ( pC==0 ){ zSp2+
10c0: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
10d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10e0: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
10f0: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
1100: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
1110: 25 73 25 54 25 73 25 54 22 2c 20 70 41 2c 20 7a  %s%T%s%T", pA, z
1120: 53 70 31 2c 20 70 42 2c 20 7a 53 70 32 2c 20 70  Sp1, pB, zSp2, p
1130: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
1140: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
1150: 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70  else if( jointyp
1160: 65 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a  e & JT_RIGHT ){.
1170: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1180: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1190: 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55     "RIGHT and FU
11a0: 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61  LL OUTER JOINs a
11b0: 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  re not currently
11c0: 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
11d0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
11e0: 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74  INNER;.  }.  ret
11f0: 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a  urn jointype;.}.
1200: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1210: 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c  e index of a col
1220: 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20  umn in a table. 
1230: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68   Return -1 if th
1240: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e  e column.** is n
1250: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1260: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  the table..*/.st
1270: 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49  atic int columnI
1280: 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62  ndex(Table *pTab
1290: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
12a0: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
12b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d  for(i=0; i<pTab-
12c0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
12d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
12e0: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
12f0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
1300: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1310: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1330: 76 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e  value of a token
1340: 20 74 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72   to a '\000'-ter
1350: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
1360: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1370: 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70  etToken(Token *p
1380: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
1390: 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29  {.  p->z = (u8*)
13a0: 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20  z;.  p->n = z ? 
13b0: 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20  strlen(z) : 0;. 
13c0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a   p->dyn = 0;.}..
13d0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20  /*.** Create an 
13e0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
13f0: 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  for an identifie
1400: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
1410: 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72  of zName.*/.Expr
1420: 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
1430: 64 45 78 70 72 28 63 6f 6e 73 74 20 63 68 61 72  dExpr(const char
1440: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65   *zName){.  Toke
1450: 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f  n dummy;.  setTo
1460: 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d  ken(&dummy, zNam
1470: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e);.  return sql
1480: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
1490: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d  0, 0, &dummy);.}
14a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74  .../*.** Add a t
14b0: 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45  erm to the WHERE
14c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a   expression in *
14d0: 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75  ppExpr that requ
14e0: 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c  ires the.** zCol
14f0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71   column to be eq
1500: 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74  ual in the two t
1510: 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20  ables pTab1 and 
1520: 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  pTab2..*/.static
1530: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
1540: 72 6d 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rm(.  const char
1550: 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f   *zCol,        /
1560: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1570: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
1580: 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20  Table *pTab1,   
1590: 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c     /* First tabl
15a0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
15b0: 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20  r *zAlias1,     
15c0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72  /* Alias for fir
15d0: 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  st table.  May b
15e0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  e NULL */.  cons
15f0: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20  t Table *pTab2, 
1600: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74       /* Second t
1610: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1620: 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20  char *zAlias2,  
1630: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1640: 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d  second table.  M
1650: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1660: 69 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  int iRightJoinTa
1670: 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45  ble,     /* VDBE
1680: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1690: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
16a0: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 20 20   Expr **ppExpr  
16b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
16c0: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
16d0: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
16e0: 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78  ssion */.){.  Ex
16f0: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1700: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1710: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1720: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1730: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1740: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 7a 43  3CreateIdExpr(zC
1750: 6f 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71  ol);.  pE2a = sq
1760: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1770: 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  r(zCol);.  if( z
1780: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1790: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
17a0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
17b0: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
17c0: 61 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73  ateIdExpr(zAlias
17d0: 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73  1);.  if( zAlias
17e0: 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69  2==0 ){.    zAli
17f0: 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61  as2 = pTab2->zNa
1800: 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d  me;.  }.  pE2b =
1810: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64   sqlite3CreateId
1820: 45 78 70 72 28 7a 41 6c 69 61 73 32 29 3b 0a 20  Expr(zAlias2);. 
1830: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 45   pE1c = sqlite3E
1840: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 31 62  xpr(TK_DOT, pE1b
1850: 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45  , pE1a, 0);.  pE
1860: 32 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  2c = sqlite3Expr
1870: 28 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70  (TK_DOT, pE2b, p
1880: 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20  E2a, 0);.  pE = 
1890: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 45  sqlite3Expr(TK_E
18a0: 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30  Q, pE1c, pE2c, 0
18b0: 29 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  );.  ExprSetProp
18c0: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
18d0: 4a 6f 69 6e 29 3b 0a 20 20 70 45 2d 3e 69 52 69  Join);.  pE->iRi
18e0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
18f0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1900: 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69    *ppExpr = sqli
1910: 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45 78  te3ExprAnd(*ppEx
1920: 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pr, pE);.}../*.*
1930: 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f  * Set the EP_Fro
1940: 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f  mJoin property o
1950: 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1960: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1970: 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20  ion..** And set 
1980: 74 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  the Expr.iRightJ
1990: 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62  oinTable to iTab
19a0: 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72  le for every ter
19b0: 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72  m in the.** expr
19c0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ession..**.** Th
19d0: 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72  e EP_FromJoin pr
19e0: 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f  operty is used o
19f0: 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78  n terms of an ex
1a00: 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c  pression to tell
1a10: 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54  .** the LEFT OUT
1a20: 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69  ER JOIN processi
1a30: 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68  ng logic that th
1a40: 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20  is term is part 
1a50: 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72  of the.** join r
1a60: 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69  estriction speci
1a70: 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  fied in the ON o
1a80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61  r USING clause a
1a90: 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a  nd not a part.**
1aa0: 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e   of the more gen
1ab0: 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73  eral WHERE claus
1ac0: 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  e.  These terms 
1ad0: 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74  are moved over t
1ae0: 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63  o the.** WHERE c
1af0: 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69  lause during joi
1b00: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74  n processing but
1b10: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   we need to reme
1b20: 6d 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a  mber that they.*
1b30: 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20  * originated in 
1b40: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
1b50: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  clause..**.** Th
1b60: 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  e Expr.iRightJoi
1b70: 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65  nTable tells the
1b80: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
1b90: 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68  ocessing that th
1ba0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
1bb0: 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65  depends on table
1bc0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1bd0: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61   even if that ta
1be0: 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78  ble is not.** ex
1bf0: 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e  plicitly mention
1c00: 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
1c10: 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f  sion.  That info
1c20: 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  rmation is neede
1c30: 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c  d.** for cases l
1c40: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1c50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1c60: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1c70: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e   ON t1.a=t2.b AN
1c80: 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54  D t1.x=5.**.** T
1c90: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
1ca0: 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74  needs to defer t
1cb0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
1cc0: 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72  he t1.x=5.** ter
1cd0: 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  m until after th
1ce0: 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65  e t2 loop of the
1cf0: 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20   join.  In that 
1d00: 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74  way, a.** NULL t
1d10: 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  2 row will be in
1d20: 73 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20  serted whenever 
1d30: 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20  t1.x!=5.  If we 
1d40: 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20  do not.** defer 
1d50: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
1d60: 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20  t1.x=5, it will 
1d70: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d  be processed imm
1d80: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65  ediately.** afte
1d90: 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e  r the t1 loop an
1da0: 64 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78  d rows with t1.x
1db0: 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  !=5 will never a
1dc0: 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20  ppear in.** the 
1dd0: 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73  output, which is
1de0: 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73   incorrect..*/.s
1df0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f  tatic void setJo
1e00: 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20  inExpr(Expr *p, 
1e10: 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77  int iTable){.  w
1e20: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45  hile( p ){.    E
1e30: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1e40: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1e50: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
1e60: 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b  nTable = iTable;
1e70: 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72  .    setJoinExpr
1e80: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
1e90: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
1ea0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
1eb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ec0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
1ed0: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
1ee0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
1ef0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
1f00: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1f10: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
1f20: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
1f30: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
1f40: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
1f50: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
1f60: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
1f70: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
1f80: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
1f90: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
1fa0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
1fb0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
1fc0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
1fd0: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
1fe0: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
1ff0: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
2000: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
2010: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
2020: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
2030: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
2040: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
2050: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
2060: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
2070: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
2080: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
2090: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
20a0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
20b0: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
20c0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
20d0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
20e0: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
20f0: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
2100: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
2110: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
2120: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
2130: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2140: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
2150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
2160: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
2170: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2180: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
2190: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b0: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
21c0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
21d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2200: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
2210: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
2220: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
2230: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2240: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
2250: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
2260: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
2270: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
2280: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
2290: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
22a0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
22b0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
22c0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
22d0: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
22e0: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
22f0: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
2300: 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20  Table *pLeftTab 
2310: 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20  = pLeft->pTab;. 
2320: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
2330: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
2340: 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  ab;..    if( pLe
2350: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
2360: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
2370: 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  nue;..    /* Whe
2380: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
2390: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
23a0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
23b0: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
23c0: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
23d0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
23e0: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
23f0: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
2400: 69 66 28 20 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74  if( pLeft->joint
2410: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2420: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
2430: 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20 70 4c 65 66  eft->pOn || pLef
2440: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2450: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2460: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2470: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2480: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2490: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
24a0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
24b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
24c0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
24d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
24e0: 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  LeftTab->nCol; j
24f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2500: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74  r *zName = pLeft
2510: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
2520: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
2530: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
2540: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  htTab, zName)>=0
2550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64   ){.          ad
2560: 64 57 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65  dWhereTerm(zName
2570: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
2580: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->zAlias, .    
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
25b0: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
25c0: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73     pRight->iCurs
25f0: 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  or, &p->pWhere);
2600: 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
2610: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2620: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61    }..    /* Disa
2630: 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64  llow both ON and
2640: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69   USING clauses i
2650: 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a  n the same join.
2660: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2670: 4c 65 66 74 2d 3e 70 4f 6e 20 26 26 20 70 4c 65  Left->pOn && pLe
2680: 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ft->pUsing ){.  
2690: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
26a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
26b0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
26c0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
26d0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
26e0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
26f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2700: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2710: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2720: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2730: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2740: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2750: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2760: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2770: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e    if( pLeft->pOn
2780: 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69   ){.      setJoi
2790: 6e 45 78 70 72 28 70 4c 65 66 74 2d 3e 70 4f 6e  nExpr(pLeft->pOn
27a0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
27b0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
27c0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
27d0: 72 41 6e 64 28 70 2d 3e 70 57 68 65 72 65 2c 20  rAnd(p->pWhere, 
27e0: 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pLeft->pOn);.   
27f0: 20 20 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 3d 20     pLeft->pOn = 
2800: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2810: 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74 65   Create extra te
2820: 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45  rms on the WHERE
2830: 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68   clause for each
2840: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20   column named.  
2850: 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e    ** in the USIN
2860: 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70  G clause.  Examp
2870: 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74  le: If the two t
2880: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2890: 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41  ed are .    ** A
28a0: 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55   and B and the U
28b0: 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65  SING clause name
28c0: 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74  s X, Y, and Z, t
28d0: 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20  hen add this.   
28e0: 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45   ** to the WHERE
28f0: 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d   clause:    A.X=
2900: 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20  B.X AND A.Y=B.Y 
2910: 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20  AND A.Z=B.Z.    
2920: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
2930: 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  or if any column
2940: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
2950: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
2960: 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e  s.    ** not con
2970: 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74  tained in both t
2980: 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e  ables to be join
2990: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
29a0: 66 28 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67  f( pLeft->pUsing
29b0: 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74   ){.      IdList
29c0: 20 2a 70 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   *pList = pLeft-
29d0: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
29e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
29f0: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
2a00: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2a10: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
2a20: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2a30: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
2a40: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
2a50: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
2a60: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2a70: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2a80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2a90: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2aa0: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
2ab0: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
2ad0: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
2ae0: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
2af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2b00: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2b10: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2b20: 54 65 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66  Term(zName, pLef
2b30: 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c  tTab, pLeft->zAl
2b40: 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ias, .          
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52 69    pRightTab, pRi
2b70: 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20  ght->zAlias,.   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
2ba0: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
2bb0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
2bc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2bd0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
2be0: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
2bf0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
2c00: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
2c10: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
2c20: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
2c30: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
2c40: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
2c50: 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20  Sorter(.  Parse 
2c60: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2c70: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
2c80: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
2c90: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
2ca0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
2cb0: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
2cc0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
2cd0: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
2ce0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2cf0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
2d00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2d10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
2d20: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2d30: 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  e, pOrderBy);.  
2d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d50: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
2d60: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
2d70: 73 6f 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  sor, 0);.  sqlit
2d80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
2d90: 50 5f 50 75 6c 6c 2c 20 70 4f 72 64 65 72 42 79  P_Pull, pOrderBy
2da0: 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 30 29 3b  ->nExpr + 1, 0);
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 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
2dd0: 63 6f 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e  cord, pOrderBy->
2de0: 6e 45 78 70 72 20 2b 20 32 2c 20 30 29 3b 0a 20  nExpr + 2, 0);. 
2df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e00: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
2e10: 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  t, pOrderBy->iEC
2e20: 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 69 66 28  ursor, 0);.  if(
2e30: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
2e40: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  >=0 ){.    int a
2e50: 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20  ddr1, addr2;.   
2e60: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
2e70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2e80: 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 53 65 6c 65  IfMemZero, pSele
2e90: 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 30 29  ct->iLimit+1, 0)
2ea0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2eb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
2ec0: 49 6e 63 72 2c 20 2d 31 2c 20 70 53 65 6c 65 63  Incr, -1, pSelec
2ed0: 74 2d 3e 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20  t->iLimit+1);.  
2ee0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
2ef0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2f00: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
2f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2f20: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
2f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2f40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74  AddOp(v, OP_Last
2f50: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
2f60: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  rsor, 0);.    sq
2f70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2f80: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
2f90: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
2fa0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2fb0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2fc0: 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c  addr2);.    pSel
2fd0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  ect->iLimit = -1
2fe0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2ff0: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
3000: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
3010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3020: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
3030: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
3040: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3050: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3060: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
3070: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
3080: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
3090: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
30a0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f   iContinue,    /
30b0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
30c0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
30d0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
30e0: 6e 50 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a  nPop          /*
30f0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
3100: 20 74 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68   to pop stack wh
3110: 65 6e 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b  en jumping */.){
3120: 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65  .  if( p->iOffse
3130: 74 3e 3d 30 20 26 26 20 69 43 6f 6e 74 69 6e 75  t>=0 && iContinu
3140: 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e!=0 ){.    int 
3150: 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  addr;.    sqlite
3160: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3170: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d  _MemIncr, -1, p-
3180: 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 61  >iOffset);.    a
3190: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
31a0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
31b0: 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65  emNeg, p->iOffse
31c0: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  t, 0);.    if( n
31d0: 50 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  Pop>0 ){.      s
31e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
31f0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c  v, OP_Pop, nPop,
3200: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
3210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3220: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
3230: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
3240: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
3250: 23 20 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65  # skip OFFSET re
3260: 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71  cords"));.    sq
3270: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3280: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  e(v, addr);.  }.
3290: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
32a0: 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63  e that will chec
32b0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
32c0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
32d0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  s of the.** stac
32e0: 6b 20 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20  k are distinct. 
32f0: 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69   iTab is a sorti
3300: 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  ng index that ho
3310: 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  lds previously.*
3320: 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69  * seen combinati
3330: 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c  ons of the N val
3340: 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72  ues.  A new entr
3350: 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61  y is made in iTa
3360: 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72  b.** if the curr
3370: 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65  ent N values are
3380: 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75   new..**.** A ju
3390: 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74  mp to addrRepeat
33a0: 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65   is made and the
33b0: 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20   N+1 values are 
33c0: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a  popped from the.
33d0: 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20  ** stack if the 
33e0: 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61  top N elements a
33f0: 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e  re not distinct.
3400: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3410: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20  codeDistinct(.  
3420: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
3430: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3440: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3450: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
3460: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
3470: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
3480: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
3490: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
34a0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
34b0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
34c0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
34d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 20 20 20 20  t */.  int N    
34e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
34f0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
3500: 6f 66 20 74 68 65 20 73 74 61 63 6b 20 6d 75 73  of the stack mus
3510: 74 20 62 65 20 64 69 73 74 69 6e 63 74 20 2a 2f  t be distinct */
3520: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .){.  sqlite3Vdb
3530: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
3540: 65 52 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b  eRecord, -N, 0);
3550: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3560: 64 4f 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e  dOp(v, OP_Distin
3570: 63 74 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65  ct, iTab, sqlite
3580: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3590: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
35a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
35b0: 5f 50 6f 70 2c 20 4e 2b 31 2c 20 30 29 3b 0a 20  _Pop, N+1, 0);. 
35c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35d0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
35e0: 20 61 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20   addrRepeat);.  
35f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
3600: 22 23 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e  "# skip indistin
3610: 63 74 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ct records"));. 
3620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3630: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
3640: 74 2c 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a  t, iTab, 0);.}..
3650: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3660: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
3670: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
3680: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
3690: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
36a0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
36b0: 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c   srcTab and nCol
36c0: 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72  umn are both zer
36d0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69  o, then the pELi
36e0: 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  st expressions.*
36f0: 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  * are evaluated 
3700: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
3710: 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69  the data for thi
3720: 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75  s row.  If nColu
3730: 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74  mn>0.** then dat
3740: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
3750: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
3760: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
3770: 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61  to get the.** da
3780: 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63 68  tatypes for each
3790: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
37a0: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e  ic int selectInn
37b0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
37c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
37d0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
37e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
37f0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
3800: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
3810: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
3820: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3830: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
3840: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
3850: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
3860: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
3870: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
3880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3890: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
38a0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
38b0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
38c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38d0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
38e0: 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
38f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3900: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
3910: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
3920: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
3930: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69   this key */.  i
3940: 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20  nt distinct,    
3950: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30         /* If >=0
3960: 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75  , make sure resu
3970: 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e 63 74  lts are distinct
3980: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39a0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
39b0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
39c0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
39e0: 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  n argument to th
39f0: 65 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  e disposal metho
3a00: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3a10: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
3a20: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
3a30: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
3a40: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
3a50: 42 72 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20  Break,          
3a60: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3a70: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
3a80: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
3a90: 2f 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20  /.  char *aff   
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
3ab0: 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69  ffinity string i
3ac0: 66 20 65 44 65 73 74 20 69 73 20 53 52 54 5f 55  f eDest is SRT_U
3ad0: 6e 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  nion */.){.  Vdb
3ae0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3af0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
3b00: 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74   int hasDistinct
3b10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
3b20: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
3b30: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
3b40: 65 6e 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d  ent */..  if( v=
3b50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3b60: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
3b70: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
3b80: 68 65 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54  here was a LIMIT
3b90: 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53   clause on the S
3ba0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
3bb0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65   then do the che
3bc0: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
3bd0: 66 20 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c  f this row shoul
3be0: 64 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  d be output..  *
3bf0: 2f 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20  /.  hasDistinct 
3c00: 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26  = distinct>=0 &&
3c10: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
3c20: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
3c30: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
3c40: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
3c50: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
3c60: 74 69 6e 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  tinue, 0);.  }..
3c70: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
3c80: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
3c90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c  .  */.  if( nCol
3ca0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
3cb0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
3cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
3cd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3ce0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
3cf0: 61 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ab, i);.    }.  
3d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75  }else{.    nColu
3d10: 6d 6e 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  mn = pEList->nEx
3d20: 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  pr;.    sqlite3E
3d30: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3d40: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 29 3b  pParse, pEList);
3d50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
3d60: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3d70: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
3d80: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
3d90: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
3da0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
3db0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
3dc0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
3dd0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
3de0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
3df0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
3e00: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
3e10: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
3e20: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
3e30: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
3e40: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
3e50: 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20 64  odeDistinct(v, d
3e60: 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  istinct, iContin
3e70: 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ue, nColumn);.  
3e80: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
3e90: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
3ea0: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
3eb0: 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  tinue, nColumn);
3ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
3ed0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
3ee0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
3ef0: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
3f00: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
3f10: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
3f20: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
3f30: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
3f40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3f50: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
3f60: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
3f70: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
3f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3f90: 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
3fa0: 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30  cord, nColumn, 0
3fb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 66 66  );.      if( aff
3fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3fd0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
3fe0: 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53  v, -1, aff, P3_S
3ff0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
4000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4010: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
4020: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30  Insert, iParm, 0
4030: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4040: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
4050: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
4060: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
4070: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
4080: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
4090: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
40a0: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
40b0: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
40c0: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
40d0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
40e0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
40f0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
4100: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
4110: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
4120: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
4130: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4140: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4150: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  n, 0);.      sql
4160: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
4170: 28 76 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f  (v, -1, aff, P3_
4180: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
4190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
41a0: 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
41b0: 69 50 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a  iParm, addr+3);.
41c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
41d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c  eAddOp(v, OP_Del
41e0: 65 74 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a  ete, iParm, 0);.
41f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4200: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
4210: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
4220: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
4230: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
4240: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4250: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
4260: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
4270: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4280: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4290: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c  MakeRecord, nCol
42a0: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  umn, 0);.      i
42b0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
42c0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
42d0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
42e0: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
42f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4310: 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  p(v, OP_NewRowid
4320: 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20  , iParm, 0);.   
4330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4340: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
4350: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
4360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4370: 70 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  p(v, OP_Insert, 
4380: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4390: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
43a0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
43b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
43c0: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
43d0: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
43e0: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
43f0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
4400: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
4410: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
4420: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
4430: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
4440: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
4450: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
4460: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
4470: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
4480: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4490: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
44a0: 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71    int addr1 = sq
44b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
44c0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69  Addr(v);.      i
44d0: 6e 74 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20  nt addr2;..     
44e0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
44f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
4500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4510: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c   OP_NotNull, -1,
4520: 20 61 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20   addr1+3);.     
4530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4540: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
4550: 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20  0);.      addr2 
4560: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
4570: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
4580: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4590: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
45a0: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
45b0: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
45c0: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
45d0: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
45e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
45f0: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
4600: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
4610: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4620: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
4630: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
4640: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
4650: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
4660: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
4670: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
4680: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
4690: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
46a0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
46b0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
46c0: 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  y, p);.      }el
46d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
46e0: 20 61 66 66 69 6e 69 74 79 20 3d 20 28 69 50 61   affinity = (iPa
46f0: 72 6d 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20  rm>>16)&0xFF;.  
4700: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
4710: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
4720: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
4730: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 69  a[0].pExpr, affi
4740: 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 20 20 73  nity);.        s
4750: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
4760: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4770: 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c  1, 0, &affinity,
4780: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
4790: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
47a0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28   OP_IdxInsert, (
47b0: 69 50 61 72 6d 26 30 78 30 30 30 30 46 46 46 46  iParm&0x0000FFFF
47c0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ), 0);.      }. 
47d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
47e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
47f0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
4800: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
4810: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
4820: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
4830: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
4840: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
4850: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4860: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
4870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4880: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
4890: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
48a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
48b0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
48c0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
48d0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
48e0: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
48f0: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
4900: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
4910: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4920: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
4930: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
4940: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
4950: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4960: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
4970: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
4980: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
4990: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
49a0: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
49b0: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
49c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
49d0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
49e0: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
49f0: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
4a00: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
4a10: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
4a20: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
4a30: 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20  derBy, p);.     
4a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4a50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4a60: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
4a70: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
4a80: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
4a90: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
4aa0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
4ab0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
4ac0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4ad0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
4ae0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
4af0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
4b00: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
4b10: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
4b20: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4b30: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
4b40: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
4b50: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
4b60: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
4b70: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
4b80: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
4b90: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
4ba0: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
4bb0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
4bc0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 75  .    case SRT_Su
4bd0: 62 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61  broutine:.    ca
4be0: 73 65 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a  se SRT_Callback:
4bf0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72   {.      if( pOr
4c00: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4c10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c20: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
4c30: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
4c40: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
4c50: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
4c60: 70 4f 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20  pOrderBy, p);.  
4c70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
4c80: 65 73 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74  est==SRT_Subrout
4c90: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
4ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4cb0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20  v, OP_Gosub, 0, 
4cc0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
4cd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4cf0: 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43   OP_Callback, nC
4d00: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
4d10: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4d20: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
4d30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4d40: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
4d50: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
4d60: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
4d70: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
4d80: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
4d90: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
4da0: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
4db0: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
4dc0: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
4dd0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
4de0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
4df0: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
4e00: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
4e10: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
4e20: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
4e30: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
4e40: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
4e50: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
4e60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
4e70: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
4e80: 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
4e90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4ea0: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  P_Pop, nColumn, 
4eb0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
4ec0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4ed0: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
4ee0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
4ef0: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
4f00: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
4f10: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
4f20: 74 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  t>=0 && pOrderBy
4f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4f40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4f50: 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70  P_MemIncr, -1, p
4f60: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  ->iLimit);.    s
4f70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4f80: 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c  v, OP_IfMemZero,
4f90: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
4fa0: 61 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ak);.  }.  retur
4fb0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
4fc0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
4fd0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
4fe0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4ff0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
5000: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
5010: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
5020: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
5030: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
5040: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
5050: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
5060: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
5070: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
5080: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
5090: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
50a0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
50b0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
50c0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
50d0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
50e0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
50f0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
5100: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
5110: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
5120: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
5130: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5140: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
5150: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
5160: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
5170: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
5180: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
5190: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
51a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
51b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
51c0: 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c   obtain from mal
51d0: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
51e0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
51f0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
5200: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
5210: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
5220: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
5230: 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79  ed.  Add the Key
5240: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
5250: 6f 20 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f  o the P3 field o
5260: 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e  f an opcode usin
5270: 67 0a 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  g.** P3_KEYINFO_
5280: 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75  HANDOFF is the u
5290: 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c  sual way of deal
52a0: 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a  ing with this..*
52b0: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
52c0: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
52d0: 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61  rList(Parse *pPa
52e0: 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  rse, ExprList *p
52f0: 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  List){.  sqlite3
5300: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5310: 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  b;.  int nExpr;.
5320: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
5330: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
5340: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
5350: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78  .  int i;..  nEx
5360: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  pr = pList->nExp
5370: 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c  r;.  pInfo = sql
5380: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
5390: 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70  f(*pInfo) + nExp
53a0: 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
53b0: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
53c0: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e  pInfo ){.    pIn
53d0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
53e0: 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43   (u8*)&pInfo->aC
53f0: 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20  oll[nExpr];.    
5400: 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  pInfo->nField = 
5410: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
5420: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
5430: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
5440: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
5450: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
5460: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
5470: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
5480: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
5490: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
54a0: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
54b0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
54c0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
54d0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
54e0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
54f0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
5500: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
5510: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
5520: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
5530: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
5540: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5550: 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pInfo;.}.../*.**
5560: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
5570: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
5580: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
5590: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
55a0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
55b0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
55c0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
55d0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
55e0: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
55f0: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
5600: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
5610: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
5620: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
5630: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
5640: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5650: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
5660: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
5670: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
5680: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
5690: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
56a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
56b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
56c0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
56d0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
56e0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
56f0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
5700: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
5710: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
5720: 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
5730: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
5740: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ta */.  int eDes
5750: 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  t,       /* Writ
5760: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
5770: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ults here */.  i
5780: 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20 20  nt iParm        
5790: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61  /* Optional para
57a0: 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65 64  meter associated
57b0: 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29   with eDest */.)
57c0: 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71  {.  int brk = sq
57d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
57e0: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e  el(v);.  int con
57f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5800: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
5810: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
5820: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
5830: 6f 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  oTab;.  ExprList
5840: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
5850: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61  pOrderBy;..  iTa
5860: 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  b = pOrderBy->iE
5870: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
5880: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
5890: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
58a0: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
58b0: 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50    pseudoTab = pP
58c0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
58d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
58e0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  Op(v, OP_OpenPse
58f0: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
5900: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
5910: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
5920: 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73  etNumColumns, ps
5930: 65 75 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e  eudoTab, nColumn
5940: 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  );.  }.  addr = 
5950: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
5960: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
5970: 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63   iTab, brk);.  c
5980: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
5990: 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  cont, 0);.  if( 
59a0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
59b0: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
59c0: 54 5f 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a  T_Subroutine ){.
59d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
59e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
59f0: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20  er, 1, 0);.  }. 
5a00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5a10: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
5a20: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
5a30: 6e 45 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77  nExpr + 1);.  sw
5a40: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
5a50: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
5a60: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
5a70: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
5a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a90: 4f 70 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  Op(v, OP_NewRowi
5aa0: 64 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  d, iParm, 0);.  
5ab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ac0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
5ad0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
5ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5af0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5b00: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  rm, 0);.      br
5b10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
5b20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5b30: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
5b40: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
5b50: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
5b60: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
5b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5b80: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
5b90: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
5ba0: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
5bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5bc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
5bd0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
5be0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5bf0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
5c00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5c10: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
5c20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
5c30: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5c40: 72 64 2c 20 31 2c 20 30 2c 20 22 63 22 2c 20 50  rd, 1, 0, "c", P
5c50: 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
5c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c70: 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  p(v, OP_IdxInser
5c80: 74 2c 20 28 69 50 61 72 6d 26 30 78 30 30 30 30  t, (iParm&0x0000
5c90: 46 46 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20  FFFF), 0);.     
5ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5cb0: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
5cc0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5cd0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
5ce0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5cf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
5d00: 6f 72 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ore, iParm, 1);.
5d10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5d20: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
5d30: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
5d40: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
5d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5d60: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
5d70: 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20  RT_Callback:.   
5d80: 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75   case SRT_Subrou
5d90: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  tine: {.      in
5da0: 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t i;.      sqlit
5db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5dc0: 50 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f  P_Insert, pseudo
5dd0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  Tab, 0);.      f
5de0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
5df0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
5e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e10: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
5e20: 70 73 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20  pseudoTab, i);. 
5e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5e40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
5e50: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
5e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e70: 28 76 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c  (v, OP_Callback,
5e80: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
5e90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5ea0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5eb0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
5ec0: 20 30 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20   0, iParm);.    
5ed0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5ee0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
5ef0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
5f00: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
5f10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5f20: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
5f30: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
5f40: 20 6c 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c   loop when the L
5f50: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 0a  IMIT is reached.
5f60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
5f70: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73  imit>=0 ){.    s
5f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5f90: 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d  v, OP_MemIncr, -
5fa0: 31 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  1, p->iLimit);. 
5fb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5fc0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
5fd0: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
5fe0: 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  brk);.  }..  /* 
5ff0: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
6000: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
6010: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6020: 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a  Label(v, cont);.
6030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6040: 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  Op(v, OP_Next, i
6050: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71  Tab, addr);.  sq
6060: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
6070: 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20  Label(v, brk);. 
6080: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6090: 43 61 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73  Callback || eDes
60a0: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
60b0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
60c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
60d0: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
60e0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a  , 0);.  }..}../*
60f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
6100: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
6110: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6120: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
6130: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
6140: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
6150: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
6160: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
6170: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
6180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
6190: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
61a0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
61b0: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
61c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
61d0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
61e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
61f0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
6200: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
6210: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
6220: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
6230: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
6240: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
6250: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
6260: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
6270: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
6280: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
6290: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
62a0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
62b0: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
62c0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
62d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
62e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
62f0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
6300: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
6310: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
6320: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
6330: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
6340: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
6350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
6360: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
6370: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
6380: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
6390: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
63a0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
63b0: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
63c0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
63d0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
63e0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
63f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
6400: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
6410: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
6420: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
6430: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
6440: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
6450: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
6460: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6470: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
6480: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
6490: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
64a0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
64b0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
64c0: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
64d0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
64e0: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
64f0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6500: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
6510: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
6520: 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53  pr==0 || pNC->pS
6530: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
6540: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  rn 0;..  /* The 
6550: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
6560: 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e  an only occur in
6570: 20 4f 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50   ORDER BY, GROUP
6580: 20 42 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20 2a   BY, HAVING,.  *
6590: 2a 20 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75  * and LIMIT clau
65a0: 73 65 73 2e 20 20 42 75 74 20 70 45 78 70 72 20  ses.  But pExpr 
65b0: 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
65c0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
65d0: 61 0a 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20 20  a.  ** SELECT.  
65e0: 53 6f 20 70 45 78 70 72 20 63 61 6e 20 6e 65 76  So pExpr can nev
65f0: 65 72 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41 53  er contain an AS
6600: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
6610: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
6620: 3e 6f 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20  >op!=TK_AS );.. 
6630: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
6640: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
6650: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
6660: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
6670: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
6680: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6690: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
66a0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
66b0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
66c0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
66d0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
66e0: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
66f0: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
6700: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
6710: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
6720: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
6730: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
6740: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
6750: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
6760: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
6770: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
6780: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
6790: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
67a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
67b0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
67c0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
67d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
67e0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
67f0: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
6800: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
6810: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
6820: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
6830: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
6840: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
6850: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
6860: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
6870: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
6880: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
6890: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
68a0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
68b0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
68c0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
68d0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
68e0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
68f0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
6900: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
6910: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
6920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6930: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
6940: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
6950: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6960: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
6970: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20     /* FIX ME:.  
6980: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
6990: 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20  n occurs if you 
69a0: 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c  have something l
69b0: 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e  ike "SELECT new.
69c0: 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20  x;" inside.     
69d0: 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e     ** a trigger.
69e0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
69f0: 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e  , if you referen
6a00: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  ce the special "
6a10: 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  new".        ** 
6a20: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73  table in the res
6a30: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c  ult set of a sel
6a40: 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ect.  We do not 
6a50: 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a  have a good way.
6a60: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69          ** to fi
6a70: 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  nd the actual ta
6a80: 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c  ble type, so cal
6a90: 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68  l it "TEXT".  Th
6aa0: 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20  is is really.   
6ab0: 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e       ** somethin
6ac0: 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20  g of a bug, but 
6ad0: 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  I do not know ho
6ae0: 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20  w to fix it..   
6af0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
6b00: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65  ** This code doe
6b10: 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68  s not produce th
6b20: 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
6b30: 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65   - it just preve
6b40: 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nts.        ** a
6b50: 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20   segfault.  See 
6b60: 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20  ticket #1229..  
6b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6b80: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
6b90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6ba0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
6bb0: 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20  ssert( pTab );. 
6bc0: 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20       if( pS ){. 
6bd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74         /* The "t
6be0: 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c  able" is actuall
6bf0: 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  y a sub-select o
6c00: 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20  r a view in the 
6c10: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
6c20: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45      ** of the SE
6c30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
6c40: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
6c50: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20  ration type and 
6c60: 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a  origin.        *
6c70: 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72  * data for the r
6c80: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
6c90: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
6ca0: 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ct..        */. 
6cb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
6cc0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70  =0 && iCol<pS->p
6cd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
6ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
6cf0: 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61  iCol is less tha
6d00: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
6d10: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75   expression requ
6d20: 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  ests the.       
6d30: 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74     ** rowid of t
6d40: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72  he sub-select or
6d50: 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72   view. This expr
6d60: 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20  ession is legal 
6d70: 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20  (see .          
6d80: 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73  ** test case mis
6d90: 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77  c2.2.2) - it alw
6da0: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
6db0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20   NULL..         
6dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61   */.          Na
6dd0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
6de0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
6df0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
6e00: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20  [iCol].pExpr;.  
6e10: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63          sNC.pSrc
6e20: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
6e30: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
6e40: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
6e50: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
6e60: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
6e70: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
6e80: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
6e90: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
6ea0: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
6eb0: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
6ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6ed0: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
6ee0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
6ef0: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
6f00: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
6f10: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
6f20: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
6f30: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
6f40: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6f50: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
6f60: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
6f70: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
6f80: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
6f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
6fa0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
6fb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
6fc0: 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  inCol = "rowid";
6fd0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6fe0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
6ff0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
7000: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
7010: 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d      zOriginCol =
7020: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7030: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7040: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
7050: 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e  inTab = pTab->zN
7060: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
7070: 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a   pNC->pParse ){.
7080: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
7090: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
70a0: 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50  aToIndex(pNC->pP
70b0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
70c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
70d0: 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20      zOriginDb = 
70e0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
70f0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
7100: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7110: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7120: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
7130: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
7140: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
7150: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
7160: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
7170: 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74   is a sub-select
7180: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7190: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
71a0: 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69  d.      ** origi
71b0: 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73  n info for the s
71c0: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
71d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
71e0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  f the SELECT.   
71f0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e     ** statement.
7200: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7210: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7220: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7230: 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  S = pExpr->pSele
7240: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
7250: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
7260: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
7270: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7280: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7290: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
72a0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
72b0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
72c0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
72d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
72e0: 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20   p, &zOriginDb, 
72f0: 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f  &zOriginTab, &zO
7300: 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20  riginCol); .    
7310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7320: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69  endif.  }.  .  i
7330: 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b  f( pzOriginDb ){
7340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f  .    assert( pzO
7350: 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72  riginTab && pzOr
7360: 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  iginCol );.    *
7370: 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72  pzOriginDb = zOr
7380: 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  iginDb;.    *pzO
7390: 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67  riginTab = zOrig
73a0: 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  inTab;.    *pzOr
73b0: 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69  iginCol = zOrigi
73c0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nCol;.  }.  retu
73d0: 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
73e0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
73f0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
7400: 74 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63  the VDBE the dec
7410: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f  laration types o
7420: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
7430: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
7440: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
7450: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
7460: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
7470: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
7480: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
7490: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
74a0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
74b0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
74c0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
74d0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
74e0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
74f0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
7500: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7510: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
7520: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
7530: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
7540: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
7550: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
7560: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
7570: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
7580: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
7590: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
75a0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
75b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
75c0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
75d0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
75e0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
75f0: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
7600: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
7610: 72 20 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d  r *zType = colum
7620: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
7630: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
7640: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
7650: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
7660: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20   must make it's 
7670: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
7680: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
7690: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
76a0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
76b0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
76c0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
76d0: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
76e0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
76f0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
7700: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
7710: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7720: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7730: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
7740: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
7750: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7760: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7770: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
7780: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50 33 5f 54  E, zOrigDb, P3_T
7790: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
77a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
77b0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
77c0: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
77d0: 61 62 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54  ab, P3_TRANSIENT
77e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
77f0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
7800: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
7810: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 33 5f  N, zOrigCol, P3_
7820: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
7830: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
7840: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7850: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
7860: 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75  he names of colu
7870: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
7880: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20  sult set.  This 
7890: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
78a0: 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  sed to provide t
78b0: 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61  he.** azCol[] va
78c0: 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c  lues in the call
78d0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
78e0: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
78f0: 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  umnNames(.  Pars
7900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
7910: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
7920: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
7930: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
7940: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
7950: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7960: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
7970: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
7980: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7990: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
79a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
79b0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
79c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
79d0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
79e0: 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65  Names, shortName
79f0: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
7a00: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
7a10: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
7a20: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
7a30: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
7a40: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
7a50: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
7a60: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
7a70: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
7a80: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
7a90: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d  olNamesSet || v=
7aa0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c  =0 || sqlite3Mal
7ab0: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 20 72 65  locFailed() ) re
7ac0: 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e  turn;.  pParse->
7ad0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b  colNamesSet = 1;
7ae0: 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28  .  fullNames = (
7af0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7b00: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
7b10: 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65  !=0;.  shortName
7b20: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
7b30: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
7b40: 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c  Names)!=0;.  sql
7b50: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
7b60: 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  ls(v, pEList->nE
7b70: 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  xpr);.  for(i=0;
7b80: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
7b90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
7ba0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c   *p;.    p = pEL
7bb0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
7bc0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
7bd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
7be0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
7bf0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
7c00: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
7c10: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
7c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7c30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
7c40: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
7c50: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
7c60: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ame));.      con
7c70: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
7c80: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
7c90: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73  OLUMN && pTabLis
7ca0: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
7cb0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
7cc0: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
7cd0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
7ce0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
7cf0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74  (j=0; j<pTabList
7d00: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
7d10: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
7d20: 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b  !=p->iTable; j++
7d30: 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
7d40: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
7d50: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
7d60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7d70: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
7d80: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
7d90: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
7da0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
7db0: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
7dc0: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
7dd0: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
7de0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
7df0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
7e00: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
7e10: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
7e20: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
7e30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
7e40: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
7e50: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
7e60: 61 6d 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e  ames && p->span.
7e70: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
7e80: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ] ){.        sql
7e90: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7ea0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7eb0: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
7ec0: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
7ed0: 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .n);.      }else
7ee0: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
7ef0: 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26  | (!shortNames &
7f00: 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  & pTabList->nSrc
7f10: 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >1) ){.        c
7f20: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
7f30: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
7f40: 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54  ab;. .        zT
7f50: 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  ab = pTabList->a
7f60: 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  [j].zAlias;.    
7f70: 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65      if( fullName
7f80: 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a  s || zTab==0 ) z
7f90: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
7fa0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
7fb0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61  e3SetString(&zNa
7fc0: 6d 65 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a  me, zTab, ".", z
7fd0: 43 6f 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Col, (char*)0);.
7fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7ff0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8000: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8010: 2c 20 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41  , zName, P3_DYNA
8020: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
8030: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8040: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8050: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8060: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65  AME, zCol, strle
8070: 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  n(zCol));.      
8080: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8090: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
80a0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
80b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
80c0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
80d0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
80e0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
80f0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8100: 20 2f 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43   /* sqlite3VdbeC
8110: 6f 6d 70 72 65 73 73 53 70 61 63 65 28 76 2c 20  ompressSpace(v, 
8120: 61 64 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65  addr); */.    }e
8130: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
8140: 7a 4e 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20  zName[30];.     
8150: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
8160: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61  TK_COLUMN || pTa
8170: 62 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bList==0 );.    
8180: 20 20 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c    sprintf(zName,
8190: 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
81a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
81b0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
81c0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
81d0: 45 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  E, zName, 0);.  
81e0: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
81f0: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
8200: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
8210: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e  pEList);.}..#ifn
8220: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8230: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
8240: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
8250: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
8260: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
8270: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
8280: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
8290: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
82a0: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
82b0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
82c0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
82d0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
82e0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
82f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8300: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
8310: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
8320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8330: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
8340: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
8350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
8360: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
8370: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
8380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
8390: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
83a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
83b0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
83c0: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  CT */../*.** For
83d0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
83e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
83f0: 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61  repSelectStmt(Pa
8400: 72 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  rse*, Select*);.
8410: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
8420: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
8430: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
8440: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
8450: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
8460: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8470: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
8480: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
8490: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
84a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
84b0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53  har *zTabName, S
84c0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
84d0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
84e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78    int i, j;.  Ex
84f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
8500: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
8510: 2a 70 43 6f 6c 3b 0a 0a 20 20 77 68 69 6c 65 28  *pCol;..  while(
8520: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
8530: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
8540: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
8550: 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
8560: 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mt(pParse, pSele
8570: 63 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ct) ){.    retur
8580: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
8590: 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
85a0: 6c 76 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  lve(pParse, pSel
85b0: 65 63 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  ect, 0) ){.    r
85c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
85d0: 54 61 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  Tab = sqliteMall
85e0: 6f 63 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  oc( sizeof(Table
85f0: 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
8600: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8610: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
8620: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
8630: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61  ->zName = zTabNa
8640: 6d 65 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75  me ? sqliteStrDu
8650: 70 28 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b  p(zTabName) : 0;
8660: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
8670: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70  ect->pEList;.  p
8680: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69  Tab->nCol = pELi
8690: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73  st->nExpr;.  ass
86a0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
86b0: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f  0 );.  pTab->aCo
86c0: 6c 20 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74  l = aCol = sqlit
86d0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
86e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70  pTab->aCol[0])*p
86f0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66  Tab->nCol );.  f
8700: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
8710: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
8720: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
8730: 20 20 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b     Expr *p, *pR;
8740: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
8750: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ;.    char *zNam
8760: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 61  e;.    char *zBa
8770: 73 65 6e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 6c  sename;.    Coll
8780: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
8790: 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61 6d  int cnt;.    Nam
87a0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
87b0: 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e    .    /* Get an
87c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
87d0: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
87e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
87f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
8800: 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
8810: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20  p->pRight==0 || 
8820: 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  p->pRight->token
8830: 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  .z==0 || p->pRig
8840: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d  ht->token.z[0]!=
8850: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  0 );.    if( (zN
8860: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8870: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
8880: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
8890: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
88a0: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
88b0: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
88c0: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
88d0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
88e0: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 4e 61 6d  qliteStrDup(zNam
88f0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  e);.    }else if
8900: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ( p->op==TK_DOT 
8910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
8920: 26 20 28 70 52 3d 70 2d 3e 70 52 69 67 68 74 29  & (pR=p->pRight)
8930: 21 3d 30 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e  !=0 && pR->token
8940: 2e 7a 20 26 26 20 70 52 2d 3e 74 6f 6b 65 6e 2e  .z && pR->token.
8950: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  z[0] ){.      /*
8960: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   For columns of 
8970: 74 68 65 20 66 72 6f 6d 20 41 2e 42 20 75 73 65  the from A.B use
8980: 20 42 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a   B as the name *
8990: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
89a0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
89b0: 25 54 22 2c 20 26 70 52 2d 3e 74 6f 6b 65 6e 29  %T", &pR->token)
89c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
89d0: 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e  p->span.z && p->
89e0: 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  span.z[0] ){.   
89f0: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
8a00: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
8a10: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
8a20: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
8a30: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
8a40: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
8a50: 28 22 25 54 22 2c 20 26 70 2d 3e 73 70 61 6e 29  ("%T", &p->span)
8a60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8a70: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 65 6c 73     /* If all els
8a80: 65 20 66 61 69 6c 73 2c 20 6d 61 6b 65 20 75 70  e fails, make up
8a90: 20 61 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20   a name */.     
8aa0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8ab0: 4d 50 72 69 6e 74 66 28 22 63 6f 6c 75 6d 6e 25  MPrintf("column%
8ac0: 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  d", i+1);.    }.
8ad0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
8ae0: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  te(zName);.    i
8af0: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
8b00: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
8b10: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4e 61    sqliteFree(zNa
8b20: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
8b30: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c  e3DeleteTable(0,
8b40: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 72 65   pTab);.      re
8b50: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
8b60: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8b70: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
8b80: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
8b90: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
8ba0: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
8bb0: 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74  pend a integer t
8bc0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
8bd0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
8be0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
8bf0: 20 7a 42 61 73 65 6e 61 6d 65 20 3d 20 7a 4e 61   zBasename = zNa
8c00: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  me;.    for(j=cn
8c10: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
8c20: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8c30: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
8c40: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
8c50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e 61  0 ){.        zNa
8c60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
8c70: 6e 74 66 28 22 25 73 3a 25 64 22 2c 20 7a 42 61  ntf("%s:%d", zBa
8c80: 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a  sename, ++cnt);.
8c90: 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
8ca0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
8cb0: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e==0 ) break;.  
8cc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8cd0: 69 66 28 20 7a 42 61 73 65 6e 61 6d 65 21 3d 7a  if( zBasename!=z
8ce0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
8cf0: 6c 69 74 65 46 72 65 65 28 7a 42 61 73 65 6e 61  liteFree(zBasena
8d00: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
8d10: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
8d20: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
8d30: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
8d40: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
8d50: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8d60: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
8d70: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
8d80: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
8d90: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
8da0: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
8db0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
8dc0: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
8dd0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 63  = sqliteStrDup(c
8de0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
8df0: 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a 20 20  p, 0, 0, 0));.  
8e00: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
8e10: 7a 54 79 70 65 3b 0a 20 20 20 20 70 43 6f 6c 2d  zType;.    pCol-
8e20: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8e30: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
8e40: 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  p);.    pColl = 
8e50: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
8e60: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
8e70: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
8e80: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
8e90: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  l = sqliteStrDup
8ea0: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pColl->zName);.
8eb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
8ec0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
8ed0: 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
8ee0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
8ef0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8f00: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
8f10: 62 79 20 64 6f 69 6e 67 20 74 68 65 20 66 6f 6c  by doing the fol
8f20: 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69 6e 67 73  lowing.** things
8f30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
8f40: 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63  Make sure VDBE c
8f50: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
8f60: 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
8f70: 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20   to every.**    
8f80: 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20       element of 
8f90: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
8fa0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46  .**.**    (2)  F
8fb0: 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c  ill in the pTabL
8fc0: 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69  ist->a[].pTab fi
8fd0: 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c  elds in the SrcL
8fe0: 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  ist that .**    
8ff0: 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f       defines FRO
9000: 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20  M clause.  When 
9010: 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20  views appear in 
9020: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  the FROM clause,
9030: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c  .**         fill
9040: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
9050: 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  Select with a co
9060: 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
9070: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
9080: 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65        that imple
9090: 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20  ments the view. 
90a0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
90b0: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45  of the view's SE
90c0: 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
90d0: 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
90e0: 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20  t we can freely 
90f0: 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65  modify or delete
9100: 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a   that statement.
9110: 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f  **         witho
9120: 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75  ut worrying abou
9130: 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65  t messing up the
9140: 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72   presistent repr
9150: 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20  esentation.**   
9160: 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65        of the vie
9170: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20  w..**.**    (3) 
9180: 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68   Add terms to th
9190: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
91a0: 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65  o accomodate the
91b0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
91c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
91d0: 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
91e0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
91f0: 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
9200: 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
9210: 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
9220: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
9230: 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
9240: 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
9250: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
9260: 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
9270: 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
9280: 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
9290: 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
92a0: 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
92b0: 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
92c0: 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
92d0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
92e0: 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
92f0: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
9300: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ABLE..**.** Retu
9310: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e  rn 0 on success.
9320: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70    If there are p
9330: 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76 65 20 61  roblems, leave a
9340: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
9350: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
9360: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
9370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9380: 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50  prepSelectStmt(P
9390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
93a0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
93b0: 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a 20 20 53  i, j, k, rc;.  S
93c0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
93d0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
93e0: 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
93f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
9400: 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  om;..  if( p==0 
9410: 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c  || p->pSrc==0 ||
9420: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
9430: 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65  iled() ){.    re
9440: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54  turn 1;.  }.  pT
9450: 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
9460: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
9470: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61  pEList;..  /* Ma
9480: 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
9490: 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
94a0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
94b0: 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
94c0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
94d0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
94e0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
94f0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
9500: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
9510: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a  rse, p->pSrc);..
9520: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
9530: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
9540: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
9550: 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
9560: 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
9570: 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
9580: 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
9590: 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
95a0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
95b0: 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
95c0: 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
95d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
95e0: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
95f0: 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
9600: 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
9610: 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
9620: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
9630: 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
9640: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
9650: 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
9660: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
9670: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
9680: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
9690: 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
96a0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
96b0: 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
96c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
96d0: 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
96e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
96f0: 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
9700: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
9710: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9720: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
9730: 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
9740: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
9750: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
9760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9770: 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30  From->pSelect!=0
9780: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
9790: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29  rom->zAlias==0 )
97a0: 7b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  {.        pFrom-
97b0: 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20  >zAlias =.      
97c0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
97d0: 74 66 28 22 73 71 6c 69 74 65 5f 73 75 62 71 75  tf("sqlite_subqu
97e0: 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
97f0: 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29  )pFrom->pSelect)
9800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9810: 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
9820: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
9830: 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
9840: 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
9850: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
9860: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
9870: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c 20 70 46  From->zAlias, pF
9880: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
9890: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
98a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
98b0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
98c0: 20 20 20 20 2f 2a 20 54 68 65 20 69 73 45 70 68      /* The isEph
98d0: 65 6d 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  em flag indicate
98e0: 73 20 74 68 61 74 20 74 68 65 20 54 61 62 6c 65  s that the Table
98f0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 62   structure has b
9900: 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20 64 79 6e  een.      ** dyn
9910: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
9920: 65 64 20 61 6e 64 20 6d 61 79 20 62 65 20 66 72  ed and may be fr
9930: 65 65 64 20 61 74 20 61 6e 79 20 74 69 6d 65 2e  eed at any time.
9940: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9950: 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54 61 62 20  ,.      ** pTab 
9960: 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
9970: 74 6f 20 61 20 70 65 72 73 69 73 74 65 6e 74 20  to a persistent 
9980: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9990: 74 68 61 74 20 64 65 66 69 6e 65 73 0a 20 20 20  that defines.   
99a0: 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68     ** part of th
99b0: 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 20  e schema. */.   
99c0: 20 20 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d     pTab->isEphem
99d0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 1;.#endif.   
99e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
99f0: 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
9a00: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
9a10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9a20: 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
9a30: 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
9a40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
9a50: 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
9a60: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
9a70: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
9a80: 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  rse,pFrom->zName
9a90: 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
9aa0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
9ab0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
9ac0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9ad0: 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
9ae0: 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
9af0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9b00: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
9b10: 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
9b20: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
9b30: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
9b40: 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
9b50: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
9b60: 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
9b70: 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
9b80: 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
9b90: 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
9ba0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9bb0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
9bc0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
9bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
9be0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
9bf0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  }.        /* If 
9c00: 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d  pFrom->pSelect!=
9c10: 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  0 it means we ar
9c20: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
9c30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77  .        ** view
9c40: 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20   within a view. 
9c50: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72 75   The SELECT stru
9c60: 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61 64  cture has alread
9c70: 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a  y been.        *
9c80: 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65 20  * copied by the 
9c90: 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77 65  outer view so we
9ca0: 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f   can skip the co
9cb0: 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20 20  py step here.   
9cc0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
9cd0: 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20  nner view..     
9ce0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
9cf0: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
9d00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9d10: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
9d20: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
9d30: 75 70 28 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  up(pTab->pSelect
9d40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9d50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9d60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
9d70: 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
9d80: 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
9d90: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
9da0: 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
9db0: 69 66 28 20 73 71 6c 69 74 65 50 72 6f 63 65 73  if( sqliteProces
9dc0: 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29  sJoin(pParse, p)
9dd0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20   ) return 1;..  
9de0: 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
9df0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
9e00: 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
9e10: 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
9e20: 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
9e30: 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
9e40: 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
9e50: 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
9e60: 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
9e70: 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
9e80: 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
9e90: 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
9ea0: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
9eb0: 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
9ec0: 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
9ed0: 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
9ee0: 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
9ef0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
9f00: 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
9f10: 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
9f20: 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
9f30: 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
9f40: 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
9f50: 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
9f60: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
9f70: 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
9f80: 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
9f90: 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
9fa0: 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
9fb0: 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
9fc0: 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
9fd0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
9fe0: 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
9ff0: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
a000: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
a010: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
a020: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
a030: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
a040: 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
a050: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
a060: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
a070: 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
a080: 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
a090: 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
a0a0: 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
a0b0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
a0c0: 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
a0d0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20    rc = 0;.  if( 
a0e0: 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
a0f0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
a100: 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
a110: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
a120: 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
a130: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
a140: 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
a150: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
a160: 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
a170: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
a180: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
a190: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
a1a0: 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
a1b0: 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
a1c0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
a1d0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a1e0: 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
a1f0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
a200: 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
a210: 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
a220: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
a230: 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
a240: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a250: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 26  llColNames)!=0 &
a260: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
a270: 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26          (flags &
a280: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
a290: 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
a2a0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
a2b0: 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
a2c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
a2d0: 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
a2e0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
a2f0: 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20  K_ALL &&.       
a300: 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f      (pE->op!=TK_
a310: 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
a320: 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67  t==0 || pE->pRig
a330: 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
a340: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
a350: 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
a360: 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
a370: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
a380: 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
a390: 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
a3a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a3b0: 41 70 70 65 6e 64 28 70 4e 65 77 2c 20 61 5b 6b  Append(pNew, a[k
a3c0: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
a3d0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
a3e0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
a3f0: 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
a400: 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
a410: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  Name;.        }e
a420: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a430: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
a440: 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
a450: 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  xpr = 0;.       
a460: 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
a470: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a480: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
a490: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
a4a0: 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
a4b0: 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
a4c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
a4d0: 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
a4e0: 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
a4f0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
a500: 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
a510: 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
a520: 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b     char *zTName;
a530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a540: 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
a550: 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
a560: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
a570: 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20  OT && pE->pLeft 
a580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  ){.          zTN
a590: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
a5a0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e  eFromToken(&pE->
a5b0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  pLeft->token);. 
a5c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a5d0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
a5e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
a5f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
a600: 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
a610: 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
a620: 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
a630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62  ){.          Tab
a640: 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
a650: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
a660: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
a670: 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
a680: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
a690: 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  zTabName==0 || z
a6a0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b  TabName[0]==0 ){
a6b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54   .            zT
a6c0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
a6d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
a6e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
a6f0: 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54 61 62 4e  zTName && (zTabN
a700: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
a710: 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20  me[0]==0 || .   
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a730: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
a740: 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
a750: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
a760: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
a770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a780: 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b    tableSeen = 1;
a790: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
a7a0: 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
a7b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a7c0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c      Expr *pExpr,
a7d0: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
a7e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
a7f0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
a800: 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20  ].zName;..      
a810: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
a820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a830: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
a840: 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
a850: 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
a870: 20 28 70 4c 65 66 74 2d 3e 6a 6f 69 6e 74 79 70   (pLeft->jointyp
a880: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
a890: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
a8b0: 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
a8c0: 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
a8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a8e0: 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
a8f0: 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
a900: 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
a910: 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
a920: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
a930: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
a940: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a950: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
a960: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
a970: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
a980: 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
a990: 78 28 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 2c  x(pLeft->pUsing,
a9a0: 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9c0: 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
a9d0: 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
a9e0: 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
a9f0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
aa00: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
aa10: 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
aa20: 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
aa30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
aa40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
aa60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
aa70: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
aa80: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
aa90: 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
aaa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
aab0: 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
aac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
aad0: 54 6f 6b 65 6e 28 26 70 52 69 67 68 74 2d 3e 74  Token(&pRight->t
aae0: 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  oken, zName);.  
aaf0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
ab00: 61 62 4e 61 6d 65 20 26 26 20 28 6c 6f 6e 67 4e  abName && (longN
ab10: 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74  ames || pTabList
ab20: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
ab30: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
ab40: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
ab50: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
ab60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
ab70: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
ab80: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
ab90: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
aba0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
abb0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
abc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
abd0: 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70       setToken(&p
abe0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61  Left->token, zTa
abf0: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
ac00: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
ac10: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 73 71 6c  pExpr->span, sql
ac20: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2e  ite3MPrintf("%s.
ac30: 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
ac40: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
ac50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
ac60: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20 20  n.dyn = 1;.     
ac70: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
ac80: 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  token.z = 0;.   
ac90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
aca0: 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20  ->token.n = 0;. 
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
acc0: 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  pr->token.dyn = 
acd0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
ace0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
acf0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
ad00: 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
ad10: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d 20    pExpr->span = 
ad20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pExpr->token;.  
ad30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ad40: 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
ad50: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
ad60: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
ad70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ad80: 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72 2c  end(pNew, pExpr,
ad90: 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
adb0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
adc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
add0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4e  xprListAppend(pN
ade0: 65 77 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67  ew, pExpr, &pRig
adf0: 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ht->token);.    
ae00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ae20: 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
ae30: 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
ae40: 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
ae50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
ae60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ae70: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
ae80: 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
ae90: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
aea0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
aeb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
aec0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
aed0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
aee0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
aef0: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
af00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af10: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 4e 61   sqliteFree(zTNa
af20: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
af30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
af40: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 45 4c  prListDelete(pEL
af50: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
af60: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
af70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
af80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
af90: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
afa0: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
afb0: 6f 75 74 69 6e 65 20 61 73 73 6f 63 69 61 74 65  outine associate
afc0: 73 20 65 6e 74 72 69 65 73 20 69 6e 20 61 6e 20  s entries in an 
afd0: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
afe0: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a  ion list with.**
aff0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 20 72 65   columns in a re
b000: 73 75 6c 74 2e 20 20 46 6f 72 20 65 61 63 68 20  sult.  For each 
b010: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
b020: 69 6f 6e 2c 20 74 68 65 20 6f 70 63 6f 64 65 20  ion, the opcode 
b030: 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65  of.** the top-le
b040: 76 65 6c 20 6e 6f 64 65 20 69 73 20 63 68 61 6e  vel node is chan
b050: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
b060: 20 61 6e 64 20 74 68 65 20 69 43 6f 6c 75 6d 6e   and the iColumn
b070: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
b080: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b090: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
b0a0: 68 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  h column number 
b0b0: 61 6e 64 20 74 68 65 20 69 54 61 62 6c 65 0a 2a  and the iTable.*
b0c0: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  * value of the t
b0d0: 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73  op-level node is
b0e0: 20 66 69 6c 6c 65 64 20 77 69 74 68 20 69 54 61   filled with iTa
b0f0: 62 6c 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ble parameter..*
b100: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b110: 65 20 70 72 69 6f 72 20 53 45 4c 45 43 54 20 63  e prior SELECT c
b120: 6c 61 75 73 65 73 2c 20 74 68 65 79 20 61 72 65  lauses, they are
b130: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
b140: 2e 20 20 41 20 6d 61 74 63 68 0a 2a 2a 20 69 6e  .  A match.** in
b150: 20 61 6e 20 65 61 72 6c 69 65 72 20 53 45 4c 45   an earlier SELE
b160: 43 54 20 74 61 6b 65 73 20 70 72 65 63 65 64 65  CT takes precede
b170: 6e 63 65 20 6f 76 65 72 20 61 20 6c 61 74 65 72  nce over a later
b180: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41   SELECT..**.** A
b190: 6e 79 20 65 6e 74 72 79 20 74 68 61 74 20 64 6f  ny entry that do
b1a0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 69 73 20  es not match is 
b1b0: 66 6c 61 67 67 65 64 20 61 73 20 61 6e 20 65 72  flagged as an er
b1c0: 72 6f 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ror.  The number
b1d0: 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 20 69 73  .** of errors is
b1e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b1f0: 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f 72  atic int matchOr
b200: 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20  derbyToColumn(. 
b210: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b220: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 70 6c           /* A pl
b230: 61 63 65 20 74 6f 20 6c 65 61 76 65 20 65 72 72  ace to leave err
b240: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
b250: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b260: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63  ,        /* Matc
b270: 68 20 74 6f 20 72 65 73 75 6c 74 20 63 6f 6c 75  h to result colu
b280: 6d 6e 73 20 6f 66 20 74 68 69 73 20 53 45 4c 45  mns of this SELE
b290: 43 54 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  CT */.  ExprList
b2a0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
b2b0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b2c0: 76 61 6c 75 65 73 20 74 6f 20 6d 61 74 63 68 20  values to match 
b2d0: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
b2e0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b300: 49 6e 73 65 72 74 20 74 68 69 73 20 76 61 6c 75  Insert this valu
b310: 65 20 69 6e 20 69 54 61 62 6c 65 20 2a 2f 0a 20  e in iTable */. 
b320: 20 69 6e 74 20 6d 75 73 74 43 6f 6d 70 6c 65 74   int mustComplet
b330: 65 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 54  e        /* If T
b340: 52 55 45 20 61 6c 6c 20 4f 52 44 45 52 20 42 59  RUE all ORDER BY
b350: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  s must match */.
b360: 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  ){.  int nErr = 
b370: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  0;.  int i, j;. 
b380: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b390: 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  t;..  if( pSelec
b3a0: 74 3d 3d 30 20 7c 7c 20 70 4f 72 64 65 72 42 79  t==0 || pOrderBy
b3b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b3c0: 20 20 69 66 28 20 6d 75 73 74 43 6f 6d 70 6c 65    if( mustComple
b3d0: 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  te ){.    for(i=
b3e0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
b3f0: 45 78 70 72 3b 20 69 2b 2b 29 7b 20 70 4f 72 64  Expr; i++){ pOrd
b400: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
b410: 3d 20 30 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  = 0; }.  }.  if(
b420: 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74 28   prepSelectStmt(
b430: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
b440: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
b450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 6c  ;.  }.  if( pSel
b460: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
b470: 20 20 20 69 66 28 20 6d 61 74 63 68 4f 72 64 65     if( matchOrde
b480: 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  rbyToColumn(pPar
b490: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  se, pSelect->pPr
b4a0: 69 6f 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 69  ior, pOrderBy, i
b4b0: 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20  Table, 0) ){.   
b4c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b4d0: 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
b4e0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
b4f0: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
b500: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
b510: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
b520: 2a 70 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  *pE = pOrderBy->
b530: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b540: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
b550: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
b560: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e  >a[i].done ) con
b570: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
b580: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
b590: 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29  ger(pE, &iCol) )
b5a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  {.      if( iCol
b5b0: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
b5c0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
b5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
b5e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
b5f0: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
b600: 20 70 6f 73 69 74 69 6f 6e 20 25 64 20 73 68 6f   position %d sho
b610: 75 6c 64 20 62 65 20 62 65 74 77 65 65 6e 20 31  uld be between 1
b620: 20 61 6e 64 20 25 64 22 2c 0a 20 20 20 20 20 20   and %d",.      
b630: 20 20 20 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74      iCol, pEList
b640: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
b650: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
b660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
b670: 0a 20 20 20 20 20 20 69 66 28 20 21 6d 75 73 74  .      if( !must
b680: 43 6f 6d 70 6c 65 74 65 20 29 20 63 6f 6e 74 69  Complete ) conti
b690: 6e 75 65 3b 0a 20 20 20 20 20 20 69 43 6f 6c 2d  nue;.      iCol-
b6a0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  -;.    }.    for
b6b0: 28 6a 3d 30 3b 20 69 43 6f 6c 3c 30 20 26 26 20  (j=0; iCol<0 && 
b6c0: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
b6d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
b6e0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e   pEList->a[j].zN
b6f0: 61 6d 65 20 26 26 20 28 70 45 2d 3e 6f 70 3d 3d  ame && (pE->op==
b700: 54 4b 5f 49 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d  TK_ID || pE->op=
b710: 3d 54 4b 5f 53 54 52 49 4e 47 29 20 29 7b 0a 20  =TK_STRING) ){. 
b720: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
b730: 6d 65 2c 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20  me, *zLabel;.   
b740: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
b750: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
b760: 0a 20 20 20 20 20 20 20 20 7a 4c 61 62 65 6c 20  .        zLabel 
b770: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
b780: 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 74 6f 6b 65  mToken(&pE->toke
b790: 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
b7a0: 72 74 28 20 7a 4c 61 62 65 6c 21 3d 30 20 29 3b  rt( zLabel!=0 );
b7b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
b7c0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
b7d0: 65 2c 20 7a 4c 61 62 65 6c 29 3d 3d 30 20 29 7b  e, zLabel)==0 ){
b7e0: 20 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c   .          iCol
b7f0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = j;.        }.
b800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
b810: 65 65 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ee(zLabel);.    
b820: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
b830: 6f 6c 3c 30 20 26 26 20 73 71 6c 69 74 65 33 45  ol<0 && sqlite3E
b840: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
b850: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
b860: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  r) ){.        iC
b870: 6f 6c 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  ol = j;.      }.
b880: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
b890: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
b8a0: 45 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  E->op = TK_COLUM
b8b0: 4e 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 43 6f  N;.      pE->iCo
b8c0: 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
b8d0: 20 20 20 70 45 2d 3e 69 54 61 62 6c 65 20 3d 20     pE->iTable = 
b8e0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
b8f0: 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20  ->iAgg = -1;.   
b900: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
b910: 5d 2e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ].done = 1;.    
b920: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30  }.    if( iCol<0
b930: 20 26 26 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65   && mustComplete
b940: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b950: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b960: 2c 0a 20 20 20 20 20 20 20 20 22 4f 52 44 45 52  ,.        "ORDER
b970: 20 42 59 20 74 65 72 6d 20 6e 75 6d 62 65 72 20   BY term number 
b980: 25 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  %d does not matc
b990: 68 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  h any result col
b9a0: 75 6d 6e 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  umn", i+1);.    
b9b0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
b9c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
b9d0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
b9e0: 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69   .}.#endif /* #i
b9f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ba00: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
ba10: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  T */../*.** Get 
ba20: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
ba30: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
ba40: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
ba50: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
ba60: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
ba70: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
ba80: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
ba90: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
baa0: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
bab0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
bac0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
bad0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
bae0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
baf0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
bb00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
bb10: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
bb20: 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  e(pParse->db);. 
bb30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
bb40: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
bb50: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
bb60: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
bb70: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
bb80: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
bb90: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
bba0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
bbb0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
bbc0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
bbd0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
bbe0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
bbf0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
bc00: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
bc10: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
bc20: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
bc30: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
bc40: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
bc50: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
bc60: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
bc70: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
bc80: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
bc90: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
bca0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
bcb0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
bcc0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
bcd0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
bce0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
bcf0: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
bd00: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
bd10: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
bd20: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
bd30: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
bd40: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bd50: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
bd60: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
bd70: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
bd80: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
bd90: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
bda0: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
bdb0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
bdc0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
bdd0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 0a   default values.
bde0: 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74 20  ** (usually but 
bdf0: 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20 70  not always -1) p
be00: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
be10: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
be20: 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21   Only if pLimit!
be30: 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30  =0 or pOffset!=0
be40: 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65   do the limit re
be50: 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72  gisters get.** r
be60: 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55  edefined.  The U
be70: 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
be80: 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70  r uses this prop
be90: 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a  erty to force.**
bea0: 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68   the reuse of th
beb0: 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64  e same limit and
bec0: 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72   offset register
bed0: 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  s across multipl
bee0: 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  e.** SELECT stat
bef0: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
bf00: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69  c void computeLi
bf10: 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72  mitRegisters(Par
bf20: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
bf30: 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61  ct *p, int iBrea
bf40: 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  k){.  Vdbe *v = 
bf50: 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20  0;.  int iLimit 
bf60: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73  = 0;.  int iOffs
bf70: 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c  et;.  int addr1,
bf80: 20 61 64 64 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20   addr2;..  /* . 
bf90: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
bfa0: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
bfb0: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
bfc0: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61  some.  ** contra
bfd0: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
bfe0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
bff0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
c000: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
c010: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
c020: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
c030: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
c040: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
c050: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
c060: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
c070: 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  t = iLimit = pPa
c080: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
c090: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32  Parse->nMem += 2
c0a0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
c0b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c0c0: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
c0d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
c0e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c0f0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  rse, p->pLimit);
c100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c110: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74  AddOp(v, OP_Must
c120: 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20  BeInt, 0, 0);.  
c130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c140: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
c150: 65 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a 20  e, iLimit, 0);. 
c160: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c170: 76 2c 20 22 23 20 4c 49 4d 49 54 20 63 6f 75 6e  v, "# LIMIT coun
c180: 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  ter"));.    sqli
c190: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c1a0: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c  OP_IfMemZero, iL
c1b0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
c1c0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
c1d0: 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f  set ){.    p->iO
c1e0: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
c1f0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
c200: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
c210: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
c220: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
c230: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
c240: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c250: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  rse, p->pOffset)
c260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c270: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73  eAddOp(v, OP_Mus
c280: 74 42 65 49 6e 74 2c 20 30 2c 20 30 29 3b 0a 20  tBeInt, 0, 0);. 
c290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c2a0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
c2b0: 72 65 2c 20 69 4f 66 66 73 65 74 2c 20 70 2d 3e  re, iOffset, p->
c2c0: 70 4c 69 6d 69 74 3d 3d 30 29 3b 0a 20 20 20 20  pLimit==0);.    
c2d0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c2e0: 22 23 20 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  "# OFFSET counte
c2f0: 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20  r"));.    addr1 
c300: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c310: 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f  Op(v, OP_IfMemPo
c320: 73 2c 20 69 4f 66 66 73 65 74 2c 20 30 29 3b 0a  s, iOffset, 0);.
c330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c340: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
c350: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
c360: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c370: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
c380: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c390: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c3a0: 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r1);.    if( p->
c3b0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
c3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c3d0: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 30 2c 20 30  (v, OP_Add, 0, 0
c3e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
c3f0: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
c400: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
c410: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c420: 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 4c 69  OP_IfMemPos, iLi
c430: 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
c440: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c450: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
c460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c470: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
c480: 74 2c 20 2d 31 2c 20 69 4c 69 6d 69 74 2b 31 29  t, -1, iLimit+1)
c490: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
c4a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c4b0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
c4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c4d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c4e0: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
c4f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c500: 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74  MemStore, iLimit
c510: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  +1, 1);.    Vdbe
c520: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c  Comment((v, "# L
c530: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
c540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c550: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
c560: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
c570: 41 6c 6c 6f 63 61 74 65 20 61 20 76 69 72 74 75  Allocate a virtu
c580: 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
c590: 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a  for sorting..*/.
c5a0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
c5b0: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 50  teSortingIndex(P
c5c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
c5d0: 6c 65 63 74 20 2a 70 2c 20 45 78 70 72 4c 69 73  lect *p, ExprLis
c5e0: 74 20 2a 70 4f 72 64 65 72 42 79 29 7b 0a 20 20  t *pOrderBy){.  
c5f0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
c600: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c610: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
c620: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3d 3d 30 20  By->iECursor==0 
c630: 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
c640: 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
c650: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
c660: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c670: 62 65 41 64 64 4f 70 28 70 50 61 72 73 65 2d 3e  beAddOp(pParse->
c680: 70 56 64 62 65 2c 20 4f 50 5f 4f 70 65 6e 45 70  pVdbe, OP_OpenEp
c690: 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69       pOrderBy->i
c6c0: 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
c6d0: 79 2d 3e 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20  y->nExpr+1);.   
c6e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
c6f0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 3d 20 2d  OpenEphm[2] == -
c700: 31 20 29 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  1 );.    p->addr
c710: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
c720: 64 72 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dr;.  }.}..#ifnd
c730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
c740: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
c750: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c760: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
c770: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
c780: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
c790: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
c7a0: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
c7b0: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
c7c0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
c7d0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
c7e0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
c7f0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
c800: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
c810: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
c820: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
c830: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
c840: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
c850: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
c860: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
c870: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
c880: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
c890: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
c8a0: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
c8b0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
c8c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
c8d0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
c8e0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
c8f0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
c900: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
c910: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
c920: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
c930: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
c940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
c950: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
c960: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
c970: 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
c980: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
c990: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
c9a0: 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
c9b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
c9c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c9d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
c9e0: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e  _SELECT */..#ifn
c9f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ca00: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
ca10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ca20: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
ca30: 70 72 6f 63 65 73 73 20 61 20 71 75 65 72 79 20  process a query 
ca40: 74 68 61 74 20 69 73 20 72 65 61 6c 6c 79 20 74  that is really t
ca50: 68 65 20 75 6e 69 6f 6e 0a 2a 2a 20 6f 72 20 69  he union.** or i
ca60: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
ca70: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
ca80: 61 74 65 20 71 75 65 72 69 65 73 2e 0a 2a 2a 0a  ate queries..**.
ca90: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
caa0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
cab0: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
cac0: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
cad0: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
cae0: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
caf0: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
cb00: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
cb10: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
cb20: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
cb30: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
cb40: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
cb50: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
cb60: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
cb70: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
cb80: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
cb90: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
cba0: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
cbb0: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
cbc0: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
cbd0: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
cbe0: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
cbf0: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
cc00: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
cc10: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
cc20: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
cc30: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
cc40: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
cc50: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
cc60: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
cc70: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
cc80: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
cc90: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
cca0: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
ccb0: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
ccc0: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
ccd0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
cce0: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
ccf0: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
cd00: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
cd10: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
cd20: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
cd30: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
cd40: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
cd50: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
cd60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cd70: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
cd80: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
cd90: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
cda0: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
cdb0: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
cdc0: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
cdd0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
cde0: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
cdf0: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
ce00: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
ce10: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
ce20: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
ce30: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
ce40: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
ce50: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
ce60: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
ce70: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
ce80: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
ce90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
cea0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
ceb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
cec0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
ced0: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
cee0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  ed */.  int eDes
cef0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
cf00: 20 5c 5f 5f 5f 20 20 53 74 6f 72 65 20 71 75 65   \___  Store que
cf10: 72 79 20 72 65 73 75 6c 74 73 20 61 73 20 73 70  ry results as sp
cf20: 65 63 69 66 69 65 64 20 2a 2f 0a 20 20 69 6e 74  ecified */.  int
cf30: 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
cf40: 20 20 20 2f 2a 20 2f 20 20 20 20 20 62 79 20 74     /* /     by t
cf50: 68 65 73 65 20 74 77 6f 20 70 61 72 61 6d 65 74  hese two paramet
cf60: 65 72 73 2e 20 20 20 20 20 20 20 20 20 2a 2f 0a  ers.         */.
cf70: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
cf80: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65 44          /* If eD
cf90: 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e  est is SRT_Union
cfa0: 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  , the affinity s
cfb0: 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
cfc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cfd0: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
cfe0: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
cff0: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
d000: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
d010: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
d020: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
d030: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
d040: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
d050: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
d060: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
d070: 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  DBE */.  int nCo
d080: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
d090: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
d0a0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
d0b0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 4c  t set */.  ExprL
d0c0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
d0d0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
d0e0: 20 63 6c 61 75 73 65 20 6f 6e 20 70 20 2a 2f 0a   clause on p */.
d0f0: 20 20 69 6e 74 20 61 53 65 74 50 32 5b 32 5d 3b    int aSetP2[2];
d100: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 50          /* Set P
d110: 32 20 76 61 6c 75 65 20 6f 66 20 74 68 65 73 65  2 value of these
d120: 20 6f 70 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66   op to number of
d130: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
d140: 74 20 6e 53 65 74 50 32 20 3d 20 30 3b 20 20 20  t nSetP2 = 0;   
d150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d160: 20 73 6c 6f 74 73 20 69 6e 20 61 53 65 74 50 32   slots in aSetP2
d170: 5b 5d 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a  [] used */..  /*
d180: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
d190: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
d1a0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
d1b0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
d1c0: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
d1d0: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
d1e0: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
d1f0: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
d200: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
d210: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  LIMIT..  */.  if
d220: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 70 50 72  ( p==0 || p->pPr
d230: 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ior==0 ){.    rc
d240: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d250: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d260: 0a 20 20 7d 0a 20 20 70 50 72 69 6f 72 20 3d 20  .  }.  pPrior = 
d270: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
d280: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
d290: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
d2a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
d2b0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
d2c0: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
d2d0: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
d2e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
d2f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d300: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
d310: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
d320: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
d330: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
d340: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d350: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d360: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d370: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d380: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d390: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
d3a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d3b0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
d3c0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d3d0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d3e0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d3f0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d400: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d410: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d420: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
d430: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
d440: 76 65 20 61 20 76 61 6c 69 64 20 71 75 65 72 79  ve a valid query
d450: 20 65 6e 67 69 6e 65 2e 20 20 49 66 20 6e 6f 74   engine.  If not
d460: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
d470: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ne..  */.  v = s
d480: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
d490: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
d4a0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  0 ){.    rc = 1;
d4b0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
d4c0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
d4d0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
d4e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
d4f0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
d500: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
d510: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
d520: 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
d530: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
d540: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
d550: 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28 61   nSetP2<sizeof(a
d560: 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61 53  SetP2)/sizeof(aS
d570: 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20 20  etP2[0]) );.    
d580: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
d590: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d5a0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
d5b0: 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d 2c 20  hemeral, iParm, 
d5c0: 30 29 3b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  0);.    eDest = 
d5d0: 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
d5e0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
d5f0: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
d600: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
d610: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
d620: 2f 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  /.  pOrderBy = p
d630: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 73 77  ->pOrderBy;.  sw
d640: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
d650: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
d660: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  {.      if( pOrd
d670: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
d680: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
d690: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d6a0: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
d6b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69   );.        pPri
d6c0: 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
d6d0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  pLimit;.        
d6e0: 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
d6f0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
d700: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d710: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
d720: 20 70 50 72 69 6f 72 2c 20 65 44 65 73 74 2c 20   pPrior, eDest, 
d730: 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20  iParm, 0, 0, 0, 
d740: 61 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  aff);.        p-
d750: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
d760: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d770: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
d780: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
d790: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d7a0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
d7b0: 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  }.        p->pPr
d7c0: 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ior = 0;.       
d7d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
d7e0: 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
d7f0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
d800: 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
d810: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
d820: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
d830: 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
d840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d850: 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f  (v, OP_IfMemZero
d860: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 30 29 3b  , p->iLimit, 0);
d870: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
d880: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4a 75  omment((v, "# Ju
d890: 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
d8a0: 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
d8b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d8c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d8d0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
d8e0: 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  est, iParm, 0, 0
d8f0: 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20  , 0, aff);.     
d900: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
d910: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 69  Prior;.        i
d920: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d930: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d940: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d950: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
d960: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
d970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d980: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
d990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d9a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d9b0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 55 4e  .      /* For UN
d9c0: 49 4f 4e 20 41 4c 4c 20 2e 2e 2e 20 4f 52 44 45  ION ALL ... ORDE
d9d0: 52 20 42 59 20 66 61 6c 6c 20 74 68 72 6f 75 67  R BY fall throug
d9e0: 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61  h to the next ca
d9f0: 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
da00: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
da10: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
da20: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
da30: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
da40: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
da50: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
da60: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
da70: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
da80: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
da90: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
daa0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
dab0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
dac0: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
dad0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
dae0: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
daf0: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
db00: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
db10: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
db20: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
db30: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
db40: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
db50: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
db60: 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 70 72 69  addr;..      pri
db70: 6f 72 4f 70 20 3d 20 70 2d 3e 6f 70 3d 3d 54 4b  orOp = p->op==TK
db80: 5f 41 4c 4c 20 3f 20 53 52 54 5f 54 61 62 6c 65  _ALL ? SRT_Table
db90: 20 3a 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   : SRT_Union;.  
dba0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 70      if( eDest==p
dbb0: 72 69 6f 72 4f 70 20 26 26 20 70 4f 72 64 65 72  riorOp && pOrder
dbc0: 42 79 3d 3d 30 20 26 26 20 21 70 2d 3e 70 4c 69  By==0 && !p->pLi
dbd0: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
dbe0: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
dbf0: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
dc00: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
dc10: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
dc20: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
dc30: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
dc40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dc50: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 69 50 61    unionTab = iPa
dc60: 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
dc70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
dc80: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
dc90: 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
dca0: 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
dcb0: 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
dcc0: 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
dcd0: 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
dce0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
dcf0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
dd00: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ab++;.        if
dd10: 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61  ( pOrderBy && ma
dd20: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
dd30: 6d 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  mn(pParse, p, pO
dd40: 72 64 65 72 42 79 2c 20 75 6e 69 6f 6e 54 61 62  rderBy, unionTab
dd50: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,1) ){.         
dd60: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
dd70: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
dd80: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
dd90: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
dda0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ddb0: 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  dOp(v, OP_OpenEp
ddc0: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
ddd0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 0);.        i
dde0: 66 28 20 70 72 69 6f 72 4f 70 3d 3d 53 52 54 5f  f( priorOp==SRT_
ddf0: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
de00: 20 20 20 61 73 73 65 72 74 28 20 6e 53 65 74 50     assert( nSetP
de10: 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50 32 29  2<sizeof(aSetP2)
de20: 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32 5b 30  /sizeof(aSetP2[0
de30: 5d 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]) );.          
de40: 61 53 65 74 50 32 5b 6e 53 65 74 50 32 2b 2b 5d  aSetP2[nSetP2++]
de50: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
de60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
de70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
de80: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
de90: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1 );.          
dea0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
deb0: 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
dec0: 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
ded0: 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31  st->usesEphm = 1
dee0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
def0: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
df00: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
df10: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
df20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
df30: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
df40: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
df50: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
df60: 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65  ements to our le
df70: 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ft.      */.    
df80: 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f    assert( !pPrio
df90: 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  r->pOrderBy );. 
dfa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dfb0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
dfc0: 70 50 72 69 6f 72 2c 20 70 72 69 6f 72 4f 70 2c  pPrior, priorOp,
dfd0: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c   unionTab, 0, 0,
dfe0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
dff0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
e000: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
e010: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
e020: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
e030: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
e040: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
e050: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 77 69 74     */.      swit
e060: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
e070: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
e080: 43 45 50 54 3a 20 20 6f 70 20 3d 20 53 52 54 5f  CEPT:  op = SRT_
e090: 45 78 63 65 70 74 3b 20 20 20 62 72 65 61 6b 3b  Except;   break;
e0a0: 0a 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54  .         case T
e0b0: 4b 5f 55 4e 49 4f 4e 3a 20 20 20 6f 70 20 3d 20  K_UNION:   op = 
e0c0: 53 52 54 5f 55 6e 69 6f 6e 3b 20 20 20 20 62 72  SRT_Union;    br
e0d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 63 61  eak;.         ca
e0e0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 6f  se TK_ALL:     o
e0f0: 70 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20  p = SRT_Table;  
e100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e110: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
e120: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
e130: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
e140: 20 20 20 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72     p->disallowOr
e150: 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
e160: 21 3d 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  !=0;.      pLimi
e170: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
e180: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
e190: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
e1a0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e1b0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
e1c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
e1d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
e1e0: 50 61 72 73 65 2c 20 70 2c 20 6f 70 2c 20 75 6e  Parse, p, op, un
e1f0: 69 6f 6e 54 61 62 2c 20 30 2c 20 30 2c 20 30 2c  ionTab, 0, 0, 0,
e200: 20 61 66 66 29 3b 0a 20 20 20 20 20 20 70 2d 3e   aff);.      p->
e210: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e220: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
e230: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
e240: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
e250: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 6d 69 74  Delete(p->pLimit
e260: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
e270: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
e280: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e290: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
e2a0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
e2b0: 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
e2c0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  = -1;.      if( 
e2d0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
e2e0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
e2f0: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
e300: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
e310: 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
e320: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e330: 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
e340: 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
e350: 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
e360: 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
e370: 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
e380: 66 28 20 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  f( eDest!=priorO
e390: 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21 3d 69  p || unionTab!=i
e3a0: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
e3b0: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
e3c0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
e3d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
e3e0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
e3f0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
e400: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
e410: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
e420: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
e430: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
e440: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
e450: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
e460: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
e470: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
e480: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
e490: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
e4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e4b0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
e4c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e4d0: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
e4e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
e4f0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
e500: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
e510: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
e520: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
e530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e540: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
e550: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
e560: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
e570: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
e580: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e590: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
e5a0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
e5b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
e5c0: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
e5d0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
e5e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
e600: 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 65 44 65  OrderBy, -1, eDe
e610: 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20 20  st, iParm, .    
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 20 20 20 20 20 20 20 20 20 69 43 6f 6e 74 2c 20           iCont, 
e640: 69 42 72 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20  iBreak, 0);.    
e650: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e660: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
e670: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
e680: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e6a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
e6b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
e6c0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
e6d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e6e0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e  , OP_Next, union
e6f0: 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  Tab, iStart);.  
e700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e710: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e720: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
e730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e740: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
e750: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
e760: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e770: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e780: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
e790: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
e7a0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
e7b0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
e7c0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
e7d0: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
e7e0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
e7f0: 20 61 64 64 72 3b 0a 0a 20 20 20 20 20 20 2f 2a   addr;..      /*
e800: 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
e810: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
e820: 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
e830: 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
e840: 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
e850: 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
e860: 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
e870: 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
e880: 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
e890: 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
e8a0: 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
e8b0: 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
e8c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
e8d0: 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
e8e0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
e8f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
e900: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
e910: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
e920: 2c 70 2c 70 4f 72 64 65 72 42 79 2c 74 61 62 31  ,p,pOrderBy,tab1
e930: 2c 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ,1) ){.        r
e940: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
e950: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
e960: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
e970: 20 20 20 20 63 72 65 61 74 65 53 6f 72 74 69 6e      createSortin
e980: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  gIndex(pParse, p
e990: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  , pOrderBy);..  
e9a0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e9b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e9c0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
e9d0: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
e9e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
e9f0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
ea00: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
ea10: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
ea20: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
ea30: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45  Rightmost->usesE
ea40: 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  phm = 1;.      a
ea50: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
ea60: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
ea70: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
ea80: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
ea90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
eaa0: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
eab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
eac0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
ead0: 2c 20 70 50 72 69 6f 72 2c 20 53 52 54 5f 55 6e  , pPrior, SRT_Un
eae0: 69 6f 6e 2c 20 74 61 62 31 2c 20 30 2c 20 30 2c  ion, tab1, 0, 0,
eaf0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
eb00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
eb10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
eb20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
eb30: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
eb40: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
eb50: 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
eb60: 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
eb70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
eb80: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
eb90: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
eba0: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
ebb0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
ebc0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
ebd0: 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
ebe0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
ebf0: 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
ec00: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
ec10: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
ec20: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
ec30: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
ec40: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
ec50: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
ec60: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ec70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
ec80: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
ec90: 50 61 72 73 65 2c 20 70 2c 20 53 52 54 5f 55 6e  Parse, p, SRT_Un
eca0: 69 6f 6e 2c 20 74 61 62 32 2c 20 30 2c 20 30 2c  ion, tab2, 0, 0,
ecb0: 20 30 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20   0, aff);.      
ecc0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
ecd0: 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  or;.      sqlite
ece0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
ecf0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d  Limit);.      p-
ed00: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
ed10: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
ed20: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
ed30: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ed40: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
ed50: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
ed60: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
ed70: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
ed80: 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
ed90: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
eda0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
edb0: 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
edc0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
edd0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
ede0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
edf0: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b  =SRT_Callback ){
ee00: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
ee10: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
ee20: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
ee30: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
ee40: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
ee50: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
ee60: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ee70: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
ee80: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
ee90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
eea0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
eeb0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eec0: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
eed0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
eee0: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
eef0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
ef00: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
ef10: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
ef20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ef30: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
ef40: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 69  iBreak);.      i
ef50: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
ef60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
ef70: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 30 29 3b  owKey, tab1, 0);
ef80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ef90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
efa0: 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
efb0: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ont);.      rc =
efc0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
efd0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
efe0: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
eff0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
f020: 65 72 42 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c  erBy, -1, eDest,
f030: 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 69 43 6f 6e 74 2c 20 69 42 72        iCont, iBr
f060: 65 61 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  eak, 0);.      i
f070: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f080: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
f090: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
f0a0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
f0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f0c0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f0d0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
f0e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
f0f0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
f100: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
f110: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f120: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
f130: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
f140: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f150: 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
f160: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
f180: 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
f190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f1a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
f1b0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
f1c0: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
f1d0: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
f1e0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
f1f0: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
f200: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
f210: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f220: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
f230: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
f240: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
f250: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
f260: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
f270: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f280: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
f290: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
f2a0: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
f2b0: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
f2c0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
f2d0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
f2e0: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
f2f0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
f300: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f310: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f320: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
f330: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
f340: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 65  of columns in te
f350: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 0a 20  mporary tables. 
f360: 20 2a 2f 0a 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e   */.  nCol = p->
f370: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
f380: 20 77 68 69 6c 65 28 20 6e 53 65 74 50 32 20 29   while( nSetP2 )
f390: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f3a0: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 53 65  eChangeP2(v, aSe
f3b0: 74 50 32 5b 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e  tP2[--nSetP2], n
f3c0: 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Col);.  }..  /* 
f3d0: 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
f3e0: 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
f3f0: 20 62 79 20 65 69 74 68 65 72 20 74 68 65 20 4f   by either the O
f400: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
f410: 72 0a 20 20 2a 2a 20 62 79 20 61 6e 79 20 74 65  r.  ** by any te
f420: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
f430: 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
f440: 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
f450: 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
f460: 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
f470: 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
f480: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f490: 73 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 0a 20  s.  Invoke the. 
f4a0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 70 72 6f   ** ORDER BY pro
f4b0: 63 65 73 73 69 6e 67 20 69 66 20 74 68 65 72 65  cessing if there
f4c0: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
f4d0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
f4e0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
f4f0: 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
f500: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
f510: 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
f520: 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
f530: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
f540: 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
f550: 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
f560: 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
f570: 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
f580: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
f590: 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
f5a0: 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
f5b0: 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
f5c0: 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
f5d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
f5e0: 64 65 72 42 79 20 7c 7c 20 70 2d 3e 75 73 65 73  derBy || p->uses
f5f0: 45 70 68 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  Ephm ){.    int 
f600: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
f620: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
f630: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
f640: 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
f650: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
f660: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
f670: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
f680: 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6a0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
f6b0: 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
f6c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
f6d0: 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20  lSeq **apColl;. 
f6e0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f     CollSeq **aCo
f6f0: 70 79 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  py;..    assert(
f700: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
f710: 70 20 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  p );.    pKeyInf
f720: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
f730: 28 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66  (sizeof(*pKeyInf
f740: 6f 29 2b 6e 43 6f 6c 2a 32 2a 73 69 7a 65 6f 66  o)+nCol*2*sizeof
f750: 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f  (CollSeq*) + nCo
f760: 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  l);.    if( !pKe
f770: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
f780: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f790: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
f7a0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f7b0: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
f7c0: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 70 50  fo->enc = ENC(pP
f7d0: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 70  arse->db);.    p
f7e0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
f7f0: 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  = nCol;..    for
f800: 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
f810: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
f820: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
f830: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
f840: 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
f850: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
f860: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
f870: 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
f880: 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
f890: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
f8a0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
f8b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
f8c0: 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
f8d0: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
f8e0: 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
f8f0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
f900: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
f910: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
f920: 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
f930: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
f940: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
f950: 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
f960: 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
f970: 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
f980: 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
f990: 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
f9a0: 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
f9b0: 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
f9c0: 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
f9d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
f9e0: 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
f9f0: 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
fa00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fa10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fa20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fa30: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
fa40: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
fa50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fa60: 33 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  3(v, addr, (char
fa70: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
fa80: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d  EYINFO);.      }
fa90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
faa0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
fab0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
fac0: 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20 3d  t_item *pOTerm =
fad0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20   pOrderBy->a;.  
fae0: 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79      int nOrderBy
faf0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
fb00: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
fb10: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75 38  t addr;.      u8
fb20: 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a 20   *pSortOrder;.. 
fb30: 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70 4b       aCopy = &pK
fb40: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43  eyInfo->aColl[nC
fb50: 6f 6c 5d 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  ol];.      pSort
fb60: 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f  Order = pKeyInfo
fb70: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
fb80: 75 38 2a 29 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d  u8*)&aCopy[nCol]
fb90: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61  ;.      memcpy(a
fba0: 43 6f 70 79 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  Copy, pKeyInfo->
fbb0: 61 43 6f 6c 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65  aColl, nCol*size
fbc0: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20  of(CollSeq*));. 
fbd0: 20 20 20 20 20 61 70 43 6f 6c 6c 20 3d 20 70 4b       apColl = pK
fbe0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20  eyInfo->aColl;. 
fbf0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
fc00: 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 20 69 2b  nOrderByExpr; i+
fc10: 2b 2c 20 70 4f 54 65 72 6d 2b 2b 2c 20 61 70 43  +, pOTerm++, apC
fc20: 6f 6c 6c 2b 2b 2c 20 70 53 6f 72 74 4f 72 64 65  oll++, pSortOrde
fc30: 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  r++){.        Ex
fc40: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 54 65  pr *pExpr = pOTe
fc50: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
fc60: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
fc70: 20 70 4f 54 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a   pOTerm->zName;.
fc80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fc90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
fca0: 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
fcb0: 43 6f 6c 75 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20  Column<nCol );. 
fcc0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
fcd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 61   ){.          *a
fce0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
fcf0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
fd00: 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b  rse, zName, -1);
fd10: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fd20: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
fd30: 6c 20 3d 20 61 43 6f 70 79 5b 70 45 78 70 72 2d  l = aCopy[pExpr-
fd40: 3e 69 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20  >iColumn];.     
fd50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 53     }.        *pS
fd60: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 54 65 72  ortOrder = pOTer
fd70: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
fd80: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
fd90: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
fda0: 74 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 61 73  t==p );.      as
fdb0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
fdc0: 6e 45 70 68 6d 5b 32 5d 3e 3d 30 20 29 3b 0a 20  nEphm[2]>=0 );. 
fdd0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 61       addr = p->a
fde0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 3b 0a  ddrOpenEphm[2];.
fdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fe00: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
fe10: 72 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  r, p->pEList->nE
fe20: 78 70 72 2b 32 29 3b 0a 20 20 20 20 20 20 70 4b  xpr+2);.      pK
fe30: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d  eyInfo->nField =
fe40: 20 6e 4f 72 64 65 72 42 79 45 78 70 72 3b 0a 20   nOrderByExpr;. 
fe50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fe60: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
fe70: 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
fe80: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
fe90: 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 70 4b  NDOFF);.      pK
fea0: 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20  eyInfo = 0;.    
feb0: 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
fec0: 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
fed0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
fee0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29  r, eDest, iParm)
fef0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
ff00: 69 74 65 46 72 65 65 28 70 4b 65 79 49 6e 66 6f  iteFree(pKeyInfo
ff10: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
ff20: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 72 65 74 75  lect_end:.  retu
ff30: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ff40: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
ff50: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
ff60: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ff70: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
ff80: 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
ff90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
ffa0: 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
ffb0: 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
ffc0: 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
ffd0: 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
ffe0: 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
fff0: 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
10000 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
10010 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
10020 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
10030 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
10040 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
10050 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10060 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
10070 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
10080 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
10090 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
100a0 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
100b0 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
100c0 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
100d0 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
100e0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
100f0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
10100 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
10110 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
10120 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
10130 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
10140 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
10150 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
10160 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
10170 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
10180 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
10190 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
101a0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
101b0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
101c0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
101d0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
101e0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
101f0 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74  xprList(ExprList
10200 2a 2c 69 6e 74 2c 45 78 70 72 4c 69 73 74 2a 29  *,int,ExprList*)
10210 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
10220 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
10230 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65  d substSelect(Se
10240 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
10250 72 4c 69 73 74 20 2a 29 3b 20 20 2f 2a 20 46 6f  rList *);  /* Fo
10260 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
10270 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
10280 78 70 72 28 45 78 70 72 20 2a 70 45 78 70 72 2c  xpr(Expr *pExpr,
10290 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70   int iTable, Exp
102a0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a  rList *pEList){.
102b0 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
102c0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
102d0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
102e0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
102f0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
10300 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
10310 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
10320 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
10330 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
10340 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
10350 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
10360 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
10370 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
10380 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
10390 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
103a0 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
103b0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
103c0 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   && pExpr->pList
103d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
103e0 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  w = pEList->a[pE
103f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
10400 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
10410 74 28 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20  t( pNew!=0 );.  
10420 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
10430 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  pNew->op;.      
10440 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
10450 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Left==0 );.     
10460 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
10470 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
10480 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  New->pLeft);.   
10490 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
104a0 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
104b0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67       pExpr->pRig
104c0 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
104d0 44 75 70 28 70 4e 65 77 2d 3e 70 52 69 67 68 74  Dup(pNew->pRight
104e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
104f0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
10500 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
10510 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
10520 45 78 70 72 4c 69 73 74 44 75 70 28 70 4e 65 77  ExprListDup(pNew
10530 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
10540 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
10550 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  pNew->iTable;.  
10560 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
10570 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20  = pNew->pTab;.  
10580 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
10590 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75  mn = pNew->iColu
105a0 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  mn;.      pExpr-
105b0 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41  >iAgg = pNew->iA
105c0 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
105d0 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78 70  3TokenCopy(&pExp
105e0 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d  r->token, &pNew-
105f0 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  >token);.      s
10600 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
10610 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  &pExpr->span, &p
10620 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  New->span);.    
10630 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74    pExpr->pSelect
10640 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10650 44 75 70 28 70 4e 65 77 2d 3e 70 53 65 6c 65 63  Dup(pNew->pSelec
10660 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
10670 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66  >flags = pNew->f
10680 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  lags;.    }.  }e
10690 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78  lse{.    substEx
106a0 70 72 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  pr(pExpr->pLeft,
106b0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
106c0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
106d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
106e0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
106f0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
10700 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
10710 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
10720 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
10730 73 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c  st(pExpr->pList,
10740 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
10750 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
10760 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
10770 74 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t(ExprList *pLis
10780 74 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 45  t, int iTable, E
10790 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 29  xprList *pEList)
107a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
107b0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
107c0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
107d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
107e0 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
107f0 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pr(pList->a[i].p
10800 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
10810 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
10820 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
10830 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
10840 69 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72  int iTable, Expr
10850 4c 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20  List *pEList){. 
10860 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
10870 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
10880 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  t(p->pEList, iTa
10890 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
108a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
108b0 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
108c0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
108d0 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
108e0 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
108f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
10900 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67  tExpr(p->pHaving
10910 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
10920 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70  );.  substExpr(p
10930 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
10940 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e  , pEList);.}.#en
10950 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10960 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10970 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
10980 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
10990 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
109a0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
109b0 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
109c0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
109d0 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
109e0 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
109f0 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
10a00 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
10a10 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
10a20 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
10a30 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
10a40 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
10a50 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
10a60 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
10a70 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
10a80 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
10a90 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
10aa0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
10ab0 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
10ac0 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
10ad0 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
10ae0 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
10af0 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
10b00 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
10b10 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
10b20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
10b30 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
10b40 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
10b50 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
10b60 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
10b70 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
10b80 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
10b90 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
10ba0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
10bb0 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
10bc0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
10bd0 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
10be0 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
10bf0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10c00 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
10c10 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
10c20 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
10c30 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
10c40 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
10c50 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
10c60 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
10c70 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
10c80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10c90 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
10ca0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
10cb0 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
10cc0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
10cd0 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
10ce0 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
10cf0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
10d00 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
10d10 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
10d20 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
10d30 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
10d40 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
10d50 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
10d60 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
10d70 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
10d80 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
10d90 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
10da0 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
10db0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10dc0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10dd0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
10de0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
10df0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
10e00 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
10e10 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
10e20 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
10e30 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
10e40 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
10e50 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10e60 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10e70 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
10e80 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
10e90 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
10ea0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
10eb0 69 6e 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  in, or.**       
10ec0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
10ed0 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f   not itself a jo
10ee0 69 6e 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30  in.  (Ticket #30
10ef0 36 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  6).**.**   (4)  
10f00 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
10f10 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20  not DISTINCT or 
10f20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
10f30 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
10f40 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20  *.**   (5)  The 
10f50 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10f60 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
10f70 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
10f80 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
10f90 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
10fa0 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
10fb0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
10fc0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
10fd0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
10fe0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
10ff0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
11000 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
11010 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
11020 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
11030 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
11040 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
11050 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
11060 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
11070 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
11080 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
11090 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
110a0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
110b0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
110c0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
110d0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
110e0 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
110f0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
11100 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
11110 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
11120 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
11130 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
11140 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
11150 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
11160 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
11170 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
11180 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
11190 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54  ..**.**  (12)  T
111a0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
111b0 6f 74 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ot the right ter
111c0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45  m of a LEFT OUTE
111d0 52 20 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a  R JOIN or the.**
111e0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
111f0 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   has no WHERE cl
11200 61 75 73 65 2e 20 20 28 61 64 64 65 64 20 62 79  ause.  (added by
11210 20 74 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a   ticket #350).**
11220 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
11230 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
11240 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
11250 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a  oth use LIMIT.**
11260 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
11270 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
11280 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a   use OFFSET.**.*
11290 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
112a0 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
112b0 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
112c0 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
112d0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
112e0 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
112f0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
11300 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
11310 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
11320 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
11330 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41   and subqueryIsA
11340 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
11350 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
11360 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
11370 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
11380 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
11390 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
113a0 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65  s a no-op and re
113b0 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66  turns 0..** If f
113c0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74  lattening is att
113d0 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74  empted this rout
113e0 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a  ine returns 1..*
113f0 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20  *.** All of the 
11400 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
11410 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f  sis must occur o
11420 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72  n both the outer
11430 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68   query and.** th
11440 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72  e subquery befor
11450 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  e this routine r
11460 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uns..*/.static i
11470 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  nt flattenSubque
11480 72 79 28 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  ry(.  Select *p,
11490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
114a0 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
114b0 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
114c0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
114d0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
114e0 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
114f0 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
11500 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
11510 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
11520 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
11530 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
11540 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
11550 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
11560 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
11570 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
11580 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
11590 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
115a0 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  s */.){.  Select
115b0 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
115c0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
115d0 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
115e0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
115f0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
11600 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
11610 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
11620 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
11630 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
11640 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
11650 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
11660 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
11670 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
11680 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
11690 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
116a0 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
116b0 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
116c0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
116d0 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
116e0 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
116f0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
11700 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
11710 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
11720 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
11730 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
11740 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
11750 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
11760 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
11770 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
11780 79 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  y */..  /* Check
11790 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
117a0 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
117b0 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
117c0 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   not..  */.  if(
117d0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
117e0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
117f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
11800 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
11810 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
11820 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
11830 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
11840 6d 5d 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  m];.  pSub = pSu
11850 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
11860 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
11870 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
11880 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
11890 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29   Restriction (1)
118c0 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75    */.  if( subqu
118d0 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
118e0 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
118f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
11900 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   Restriction (2)
11910 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d    */.  pSubSrc =
11920 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
11930 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
11940 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
11950 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
11960 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
11970 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
11980 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
11990 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
119a0 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73  ary expresssions
119b0 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
119c0 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
119d0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
119e0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
119f0 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
11a00 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
11a10 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
11a20 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
11a30 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
11a40 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
11a50 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
11a60 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
11a70 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
11a80 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
11a90 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
11aa0 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
11ab0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
11ac0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11ad0 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
11ae0 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
11af0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11b20 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
11b30 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
11b40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11b70 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
11b80 66 28 20 28 70 53 75 62 2d 3e 69 73 44 69 73 74  f( (pSub->isDist
11b90 69 6e 63 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c  inct || pSub->pL
11ba0 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20  imit) .         
11bb0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
11bc0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20   || isAgg) ){   
11bd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
11be0 63 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29  ctions (4)(5)(8)
11bf0 28 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75  (9) */.     retu
11c00 72 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d  rn 0;       .  }
11c10 0a 20 20 69 66 28 20 70 2d 3e 69 73 44 69 73 74  .  if( p->isDist
11c20 69 6e 63 74 20 26 26 20 73 75 62 71 75 65 72 79  inct && subquery
11c30 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
11c40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
11c50 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f  triction (6)  */
11c60 0a 20 20 69 66 28 20 28 70 2d 3e 64 69 73 61 6c  .  if( (p->disal
11c70 6c 6f 77 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d  lowOrderBy || p-
11c80 3e 70 4f 72 64 65 72 42 79 29 20 26 26 20 70 53  >pOrderBy) && pS
11c90 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
11ca0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
11ce0 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a  riction (11) */.
11cf0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69    }..  /* Restri
11d00 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
11d10 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
11d20 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
11d30 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
11d40 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
11d50 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
11d60 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
11d70 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
11d80 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
11d90 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
11da0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
11db0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
11dc0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
11dd0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
11de0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
11df0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
11e00 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
11e10 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
11e20 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
11e30 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
11e40 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
11e50 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
11e60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
11e70 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20  bSrc->nSrc>1 && 
11e80 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 53 72 63  iFrom>0 && (pSrc
11e90 2d 3e 61 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69  ->a[iFrom-1].joi
11ea0 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
11eb0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
11ec0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
11ed0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
11ee0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
11ef0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
11f00 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
11f10 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
11f20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
11f30 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
11f40 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
11f50 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
11f60 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
11f70 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
11f80 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
11f90 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
11fa0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
11fb0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
11fc0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
11fd0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
11fe0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
11ff0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
12000 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
12010 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
12020 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
12030 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
12040 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
12050 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
12060 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
12070 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
12080 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
12090 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
120a0 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
120b0 2f 0a 20 20 69 66 28 20 69 46 72 6f 6d 3e 30 20  /.  if( iFrom>0 
120c0 26 26 20 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f  && (pSrc->a[iFro
120d0 6d 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  m-1].jointype & 
120e0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20  JT_OUTER)!=0 .  
120f0 20 20 20 20 26 26 20 70 53 75 62 2d 3e 70 57 68      && pSub->pWh
12100 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ere!=0 ){.    re
12110 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
12120 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12130 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
12140 6e 73 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  ns flattening is
12150 20 70 65 72 6d 69 74 74 65 64 20 66 6f 72 20 74   permitted for t
12160 68 65 0a 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68  he.  ** iFrom-th
12170 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
12180 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
12190 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
121a0 2a 2f 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c  */..  /* Move al
121b0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
121c0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
121d0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
121e0 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
121f0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
12200 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
12210 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
12220 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
12230 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
12240 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
12250 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
12260 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
12270 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
12280 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
12290 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
122a0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
122b0 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
122c0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
122d0 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
122e0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
122f0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
12300 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
12310 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
12320 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
12330 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
12340 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
12350 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
12360 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72   in..  */.  iPar
12370 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
12380 69 43 75 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20  iCursor;.  {.   
12390 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d 20 70   int nSubSrc = p
123a0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  SubSrc->nSrc;.  
123b0 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
123c0 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
123d0 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
123e0 33 44 65 6c 65 74 65 54 61 62 6c 65 28 30 2c 20  3DeleteTable(0, 
123f0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b  pSubitem->pTab);
12400 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
12410 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
12420 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
12430 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a  Free(pSubitem->z
12440 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
12450 65 46 72 65 65 28 70 53 75 62 69 74 65 6d 2d 3e  eFree(pSubitem->
12460 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28  zAlias);.    if(
12470 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
12480 20 20 20 20 69 6e 74 20 65 78 74 72 61 20 3d 20      int extra = 
12490 6e 53 75 62 53 72 63 20 2d 20 31 3b 0a 20 20 20  nSubSrc - 1;.   
124a0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53     for(i=1; i<nS
124b0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
124c0 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69       pSrc = sqli
124d0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
124e0 28 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20  (pSrc, 0, 0);.  
124f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
12500 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
12510 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
12520 72 63 2d 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69  rc-1; i-extra>=i
12530 46 72 6f 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  From; i--){.    
12540 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d      pSrc->a[i] =
12550 20 70 53 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61   pSrc->a[i-extra
12560 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
12570 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12580 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
12590 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
125a0 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
125b0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
125c0 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
125d0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
125e0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
125f0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
12600 5b 69 46 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31  [iFrom+nSubSrc-1
12610 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
12620 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ntype;.  }..  /*
12630 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
12640 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
12650 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
12660 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a  essions for .  *
12670 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
12680 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
12690 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
126a0 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70    ** .  ** Examp
126b0 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
126c0 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
126d0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
126e0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
126f0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
12700 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20   a>b;.  **   \  
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
12730 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
12740 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
12750 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f  /.  **    \_____
12760 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12770 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
12780 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12790 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a  ___________/.  *
127a0 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61  *.  ** We look a
127b0 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
127c0 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
127d0 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
127e0 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 2a  place we see.  *
127f0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
12800 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
12810 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
12820 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
12830 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a  te "y+10"..  */.
12840 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
12850 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
12860 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
12870 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
12880 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
12890 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
128a0 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
128b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
128c0 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
128d0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
128e0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
128f0 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  eStrNDup((char*)
12900 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
12910 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
12920 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75 62 73 74     }.  }.  subst
12930 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
12940 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
12950 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 69 66  b->pEList);.  if
12960 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 73  ( isAgg ){.    s
12970 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
12980 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
12990 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
129a0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  ;.    substExpr(
129b0 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  p->pHaving, iPar
129c0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
129d0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  t);.  }.  if( pS
129e0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
129f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12a00 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
12a10 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
12a20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
12a30 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
12a40 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  By = 0;.  }else 
12a50 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
12a60 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  ){.    substExpr
12a70 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
12a80 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
12a90 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  >pEList);.  }.  
12aa0 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
12ab0 20 29 7b 0a 20 20 20 20 70 57 68 65 72 65 20 3d   ){.    pWhere =
12ac0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
12ad0 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
12ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 57 68 65   }else{.    pWhe
12af0 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  re = 0;.  }.  if
12b00 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
12b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12b20 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
12b30 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
12b40 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
12b50 70 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  p->pWhere = pWhe
12b60 72 65 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  re;.    substExp
12b70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  r(p->pHaving, iP
12b80 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
12b90 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  ist);.    p->pHa
12ba0 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
12bb0 70 72 41 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67  prAnd(p->pHaving
12bc0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  , sqlite3ExprDup
12bd0 28 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29  (pSub->pHaving))
12be0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12bf0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
12c00 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
12c10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
12c20 74 44 75 70 28 70 53 75 62 2d 3e 70 47 72 6f 75  tDup(pSub->pGrou
12c30 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pBy);.  }else{. 
12c40 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
12c50 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c  pWhere, iParent,
12c60 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12c70 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
12c80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
12c90 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
12ca0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
12cb0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
12cc0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
12cd0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
12ce0 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74   or the.  ** out
12cf0 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
12d00 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d  inct. .  */.  p-
12d10 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
12d20 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20 70  >isDistinct || p
12d30 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b  Sub->isDistinct;
12d40 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45  ..  /*.  ** SELE
12d50 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
12d60 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
12d70 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
12d80 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a  x OFFSET y;.  **
12d90 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d  .  ** One is tem
12da0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
12db0 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
12dc0 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
12dd0 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 2a 2a  .  But this.  **
12de0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
12df0 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
12e00 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f  s negative..  */
12e10 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
12e20 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  mit ){.    p->pL
12e30 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69  imit = pSub->pLi
12e40 6d 69 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  mit;.    pSub->p
12e50 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Limit = 0;.  }..
12e60 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
12e70 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
12e80 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
12e90 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
12ea0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
12eb0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12ec0 44 65 6c 65 74 65 28 70 53 75 62 29 3b 0a 20 20  Delete(pSub);.  
12ed0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
12ee0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12ef0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
12f00 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c   Analyze the SEL
12f10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ECT statement pa
12f20 73 73 65 64 20 69 6e 20 61 73 20 61 6e 20 61 72  ssed in as an ar
12f30 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66  gument to see if
12f40 20 69 74 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70   it.** is a simp
12f50 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
12f60 29 20 71 75 65 72 79 2e 20 20 49 66 20 69 74 20  ) query.  If it 
12f70 69 73 20 61 6e 64 20 74 68 69 73 20 71 75 65 72  is and this quer
12f80 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69  y can be.** sati
12f90 73 66 69 65 64 20 75 73 69 6e 67 20 61 20 73 69  sfied using a si
12fa0 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20 74 68 65  ngle seek to the
12fb0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e   beginning or en
12fc0 64 20 6f 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a  d of an index,.*
12fd0 2a 20 74 68 65 6e 20 67 65 6e 65 72 61 74 65 20  * then generate 
12fe0 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 69  the code for thi
12ff0 73 20 53 45 4c 45 43 54 20 61 6e 64 20 72 65 74  s SELECT and ret
13000 75 72 6e 20 31 2e 20 20 49 66 20 74 68 69 73 20  urn 1.  If this 
13010 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d  is not a .** sim
13020 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  ple min() or max
13030 28 29 20 71 75 65 72 79 2c 20 74 68 65 6e 20 72  () query, then r
13040 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41  eturn 0;.**.** A
13050 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72   simply min() or
13060 20 6d 61 78 28 29 20 71 75 65 72 79 20 6c 6f 6f   max() query loo
13070 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ks like this:.**
13080 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 69  .**    SELECT mi
13090 6e 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  n(a) FROM table;
130a0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 6d 61  .**    SELECT ma
130b0 78 28 61 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b  x(a) FROM table;
130c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79  .**.** The query
130d0 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c 79 20 61   may have only a
130e0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
130f0 20 69 74 73 20 46 52 4f 4d 20 61 72 67 75 6d 65   its FROM argume
13100 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 63 61  nt.  There.** ca
13110 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50 20 42 59  n be no GROUP BY
13120 20 6f 72 20 48 41 56 49 4e 47 20 6f 72 20 57 48   or HAVING or WH
13130 45 52 45 20 63 6c 61 75 73 65 73 2e 20 20 54 68  ERE clauses.  Th
13140 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 75 73  e result set mus
13150 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d 69 6e 28  t.** be the min(
13160 29 20 6f 72 20 6d 61 78 28 29 20 6f 66 20 61 20  ) or max() of a 
13170 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66  single column of
13180 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
13190 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68   column.** in th
131a0 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  e min() or max()
131b0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
131c0 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a  e indexed..**.**
131d0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   The parameters 
131e0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
131f0 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
13200 66 6f 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63  for sqlite3Selec
13210 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20  t()..** See the 
13220 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
13230 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
13240 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
13250 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
13260 61 74 69 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d  atic int simpleM
13270 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72 73 65  inMaxQuery(Parse
13280 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
13290 20 2a 70 2c 20 69 6e 74 20 65 44 65 73 74 2c 20   *p, int eDest, 
132a0 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 45 78  int iParm){.  Ex
132b0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74  pr *pExpr;.  int
132c0 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a   iCol;.  Table *
132d0 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
132e0 49 64 78 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b  Idx;.  int base;
132f0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
13300 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72  t seekOp;.  Expr
13310 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70  List *pEList, *p
13320 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73  List, eList;.  s
13330 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
13340 74 65 6d 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20  tem eListItem;. 
13350 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
13360 20 20 69 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74    int brk;.  int
13370 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   iDb;..  /* Chec
13380 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  k to see if this
13390 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
133a0 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28  le min() or max(
133b0 29 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  ) query.  Return
133c0 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74  .  ** zero if it
133d0 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20   is  not..  */. 
133e0 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
133f0 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c   || p->pHaving |
13400 7c 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  | p->pWhere ) re
13410 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
13420 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
13430 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
13440 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69  return 0;.  pELi
13450 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
13460 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
13470 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
13480 30 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c  0;.  pExpr = pEL
13490 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
134a0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
134b0 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
134c0 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
134d0 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
134e0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73  List;.  if( pLis
134f0 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e  t==0 || pList->n
13500 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
13510 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
13520 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
13530 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
13540 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
13550 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
13560 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
13570 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70 20 3d 20  ){.    seekOp = 
13580 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c  OP_Rewind;.  }el
13590 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
135a0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
135b0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61  xpr->token.z,"ma
135c0 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",3)==0 ){.    
135d0 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74  seekOp = OP_Last
135e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
135f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
13600 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
13610 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
13620 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
13630 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  LUMN ) return 0;
13640 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  .  iCol = pExpr-
13650 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62  >iColumn;.  pTab
13660 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54   = pSrc->a[0].pT
13670 61 62 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ab;...  /* If we
13680 20 67 65 74 20 74 6f 20 68 65 72 65 2c 20 69 74   get to here, it
13690 20 6d 65 61 6e 73 20 74 68 65 20 71 75 65 72 79   means the query
136a0 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
136b0 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68  ct form..  ** Ch
136c0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
136d0 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64 65   we have an inde
136e0 78 20 61 6e 64 20 6d 61 6b 65 20 70 49 64 78 20  x and make pIdx 
136f0 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  point to the.  *
13700 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e  * appropriate in
13710 64 65 78 2e 20 20 49 66 20 74 68 65 20 6d 69 6e  dex.  If the min
13720 28 29 20 6f 72 20 6d 61 78 28 29 20 69 73 20 6f  () or max() is o
13730 6e 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  n an INTEGER PRI
13740 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f  MARY.  ** key co
13750 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69  lumn, no index i
13760 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 73  s necessary so s
13770 65 74 20 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e  et pIdx to NULL.
13780 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61    If no.  ** usa
13790 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
137a0 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  nd, return 0..  
137b0 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  */.  if( iCol<0 
137c0 29 7b 0a 20 20 20 20 70 49 64 78 20 3d 20 30 3b  ){.    pIdx = 0;
137d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f  .  }else{.    Co
137e0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
137f0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13800 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  q(pParse, pExpr)
13810 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
13820 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
13830 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
13840 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
13850 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
13860 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
13870 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
13880 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20  [0]==iCol && .  
13890 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
138a0 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
138b0 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c  azColl[0], pColl
138c0 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
138d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
138e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
138f0 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
13900 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
13910 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
13920 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
13930 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
13940 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
13950 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
13960 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
13970 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
13980 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
13990 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
139a0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
139b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
139c0 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
139d0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
139e0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
139f0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13a00 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
13a10 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
13a20 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
13a30 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
13a40 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13a50 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
13a60 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
13a70 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
13a80 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
13a90 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13aa0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
13ab0 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
13ac0 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63   /* Generating c
13ad0 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ode to find the 
13ae0 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20  min or the max. 
13af0 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77   Basically all w
13b00 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
13b10 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69  o is find the fi
13b20 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20  rst or the last 
13b30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f  entry in the cho
13b40 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20  sen index.  If. 
13b50 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   ** the min() or
13b60 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65   max() is on the
13b70 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13b80 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20   KEY, then find 
13b90 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f  the first.  ** o
13ba0 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  r last entry in 
13bb0 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
13bc0 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
13bd0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13be0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
13bf0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13c00 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 7c  assert( iDb>=0 |
13c10 7c 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20  | pTab->isEphem 
13c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
13c30 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
13c40 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
13c50 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
13c60 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
13c70 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
13c80 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20 3d  zName);.  base =
13c90 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
13ca0 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71 6c  sor;.  brk = sql
13cb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
13cc0 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
13cd0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
13ce0 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a 20  arse, p, brk);. 
13cf0 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
13d00 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
13d10 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
13d20 6c 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  le(pParse, base,
13d30 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
13d40 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20 20  penRead);.  }.  
13d50 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
13d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d70 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62  dOp(v, seekOp, b
13d80 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ase, 0);.  }else
13d90 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68  {.    /* Even th
13da0 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20  ough the cursor 
13db0 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
13dc0 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63   index here is c
13dd0 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20  losed.    ** as 
13de0 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65  soon as a single
13df0 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20   value has been 
13e00 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c  read from it, al
13e10 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  locate it.    **
13e20 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e   using (pParse->
13e30 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65  nTab++) to preve
13e40 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64  nt the cursor id
13e50 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20   from being .   
13e60 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73   ** reused. This
13e70 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f   is important fo
13e80 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20  r statements of 
13e90 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a  the form .    **
13ea0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20   "INSERT INTO x 
13eb0 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f  SELECT max() FRO
13ec0 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  M x"..    */.   
13ed0 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 4b   int iIdx;.    K
13ee0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
13ef0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
13f00 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
13f10 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50 61  ;.    iIdx = pPa
13f20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
13f30 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
13f40 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13f50 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
13f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13f70 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
13f80 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
13f90 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
13fa0 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70  penRead, iIdx, p
13fb0 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20  Idx->tnum, .    
13fc0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
13fd0 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
13fe0 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73 65  OFF);.    if( se
13ff0 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
14000 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14010 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14020 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
14030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14040 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
14050 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  cord, 1, 0);.   
14060 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
14070 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20  oveGt;.    }.   
14080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14090 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
140a0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
140b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
140c0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
140d0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
140e0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
140f0 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
14100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14110 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
14120 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
14130 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
14140 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
14150 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
14160 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
14170 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
14180 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
14190 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
141a0 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
141b0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
141c0 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
141d0 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
141e0 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20  Parm, brk, brk, 
141f0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
14200 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14210 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33   brk);.  sqlite3
14220 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14230 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
14240 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
14250 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
14260 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
14270 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
14280 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
14290 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
142a0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
142b0 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
142c0 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
142d0 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
142e0 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
142f0 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
14300 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
14310 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
14320 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
14330 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
14340 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
14350 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
14360 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
14370 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
14380 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
14390 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
143a0 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
143b0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
143c0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
143d0 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45  tatement. */.  E
143e0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
143f0 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
14400 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
14410 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
14420 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
14430 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
14440 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
14450 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
14460 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
14470 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14480 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14490 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
144a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
144b0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
144c0 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20  LECT */.  Parse 
144d0 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
144e0 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68  Parse;     /* Th
144f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
14500 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
14510 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29  assert( pEList )
14520 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
14530 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
14540 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
14550 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
14560 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
14570 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  l;.    Expr *pE 
14580 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14590 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
145a0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
145b0 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
145c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
145d0 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
145e0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
145f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14600 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20 20  rDelete(pE);.   
14610 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65 72       pE = pOrder
14620 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
14630 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
14640 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d 31  pEList->a[iCol-1
14650 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
14660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
14670 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14680 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
14690 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d 6e     "%s BY column
146a0 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20 6f   number %d out o
146b0 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
146c0 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20   be ".          
146d0 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
146e0 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f 6c  %d", zType, iCol
146f0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
14700 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
14710 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
14720 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14730 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
14740 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20  s(pNC, pE) ){.  
14750 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14760 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14770 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
14780 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
14790 65 73 20 61 6e 79 20 6e 61 6d 65 73 20 75 73 65  es any names use
147a0 64 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  d in the result 
147b0 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75  set of the.** su
147c0 70 70 6c 69 65 64 20 53 45 4c 45 43 54 20 73 74  pplied SELECT st
147d0 61 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 65 20  atement. If the 
147e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
147f0 20 62 65 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a   being resolved.
14800 2a 2a 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  ** is a sub-sele
14810 63 74 2c 20 74 68 65 6e 20 70 4f 75 74 65 72 4e  ct, then pOuterN
14820 43 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  C is a pointer t
14830 6f 20 74 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78  o the NameContex
14840 74 20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 72  t .** of the par
14850 65 6e 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69  ent SELECT..*/.i
14860 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
14870 52 65 73 6f 6c 76 65 28 0a 20 20 50 61 72 73 65  Resolve(.  Parse
14880 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14890 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
148a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
148b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
148c0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
148d0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
148e0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
148f0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
14900 72 4e 43 20 20 2f 2a 20 54 68 65 20 6f 75 74 65  rNC  /* The oute
14910 72 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  r name context. 
14920 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
14930 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
14940 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  EList;          
14950 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 2e 20 2a  /* Result set. *
14960 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14980 2a 20 46 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61  * For-loop varia
14990 62 6c 65 20 75 73 65 64 20 69 6e 20 6d 75 6c 74  ble used in mult
149a0 69 70 6c 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20  iple places */. 
149b0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
149c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
149d0 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
149e0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
149f0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 20  *pGroupBy;      
14a00 20 20 2f 2a 20 54 68 65 20 67 72 6f 75 70 20 62    /* The group b
14a10 79 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f  y clause */..  /
14a20 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
14a30 65 20 68 61 73 20 72 75 6e 20 62 65 66 6f 72 65  e has run before
14a40 2c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  , return immedia
14a50 74 65 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tely. */.  if( p
14a60 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a  ->isResolved ){.
14a70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4f 75      assert( !pOu
14a80 74 65 72 4e 43 20 29 3b 0a 20 20 20 20 72 65 74  terNC );.    ret
14a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14aa0 20 7d 0a 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76   }.  p->isResolv
14ab0 65 64 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  ed = 1;..  /* If
14ac0 20 74 68 65 72 65 20 68 61 76 65 20 61 6c 72 65   there have alre
14ad0 61 64 79 20 62 65 65 6e 20 65 72 72 6f 72 73 2c  ady been errors,
14ae0 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a   do nothing. */.
14af0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
14b00 72 72 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  rr>0 ){.    retu
14b10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
14b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61  .  }..  /* Prepa
14b30 72 65 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  re the select st
14b40 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 63 61  atement. This ca
14b50 6c 6c 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65  ll will allocate
14b60 20 61 6c 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a   all cursors.  *
14b70 2a 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  * required to ha
14b80 6e 64 6c 65 20 74 68 65 20 74 61 62 6c 65 73 20  ndle the tables 
14b90 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 69  and subqueries i
14ba0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
14bb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72  e..  */.  if( pr
14bc0 65 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61  epSelectStmt(pPa
14bd0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
14be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
14bf0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  OR;.  }..  /* Re
14c00 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73  solve the expres
14c10 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d  sions in the LIM
14c20 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
14c30 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 2a  auses. These.  *
14c40 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
14c50 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
14c60 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
14c70 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
14c80 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  ntext..  */.  me
14c90 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
14ca0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e  zeof(sNC));.  sN
14cb0 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
14cc0 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
14cd0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
14ce0 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74  (&sNC, p->pLimit
14cf0 29 20 7c 7c 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ||.      sqlit
14d00 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
14d10 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66  es(&sNC, p->pOff
14d20 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  set) ){.    retu
14d30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
14d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75  .  }..  /* Set u
14d50 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
14d60 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
14d70 20 74 6f 20 45 78 70 72 52 65 73 6f 6c 76 65 4e   to ExprResolveN
14d80 61 6d 65 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72  ames() to.  ** r
14d90 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
14da0 73 73 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f  ssion-list..  */
14db0 0a 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20  .  sNC.allowAgg 
14dc0 3d 20 31 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  = 1;.  sNC.pSrcL
14dd0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
14de0 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
14df0 74 65 72 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73  terNC;..  /* Res
14e00 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
14e10 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
14e20 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
14e30 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 21 70 45  EList;.  if( !pE
14e40 4c 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  List ) return SQ
14e50 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f  LITE_ERROR;.  fo
14e60 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
14e70 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14e80 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c    Expr *pX = pEL
14e90 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
14ea0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14eb0 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
14ec0 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
14ed0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14ee0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
14ef0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
14f00 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
14f10 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
14f20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
14f30 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
14f40 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
14f50 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
14f60 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
14f70 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
14f80 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
14f90 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 69 73    assert( !p->is
14fa0 41 67 67 20 29 3b 0a 20 20 70 47 72 6f 75 70 42  Agg );.  pGroupB
14fb0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
14fc0 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20  .  if( pGroupBy 
14fd0 7c 7c 20 73 4e 43 2e 68 61 73 41 67 67 20 29 7b  || sNC.hasAgg ){
14fe0 0a 20 20 20 20 70 2d 3e 69 73 41 67 67 20 3d 20  .    p->isAgg = 
14ff0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
15000 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
15010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
15020 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
15030 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
15040 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
15050 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
15060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
15070 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75  Having && !pGrou
15080 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
15090 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
150a0 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63  e, "a GROUP BY c
150b0 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
150c0 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22  d before HAVING"
150d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
150e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
150f0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78  .  /* Add the ex
15100 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
15110 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
15120 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
15130 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
15140 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
15150 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15160 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
15170 74 68 61 74 0a 20 20 2a 2a 20 65 78 70 72 65 73  that.  ** expres
15180 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
15190 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29  RE clause (etc.)
151a0 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78   can refer to ex
151b0 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a  pressions by.  *
151c0 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65  * aliases in the
151d0 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a   result set..  *
151e0 2a 0a 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69  *.  ** Minor poi
151f0 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74  nt: If this is t
15200 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
15210 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  e expression wil
15220 6c 20 62 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61  l be.  ** re-eva
15230 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
15240 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
15250 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69  .  */.  sNC.pELi
15260 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
15270 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
15280 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
15290 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c  NC, p->pWhere) |
152a0 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  |.      sqlite3E
152b0 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
152c0 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
152d0 29 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65  ) ||.      proce
152e0 73 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  ssOrderGroupBy(&
152f0 73 4e 43 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  sNC, p->pOrderBy
15300 2c 20 22 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20  , "ORDER") ||.  
15310 20 20 20 20 70 72 6f 63 65 73 73 4f 72 64 65 72      processOrder
15320 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 47  GroupBy(&sNC, pG
15330 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29  roupBy, "GROUP")
15340 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
15350 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15360 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
15370 72 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  re the GROUP BY 
15380 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
15390 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74  contain aggregat
153a0 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  e functions..  *
153b0 2f 0a 20 20 69 66 28 20 70 47 72 6f 75 70 42 79  /.  if( pGroupBy
153c0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
153d0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
153e0 74 65 6d 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28  tem;.  .    for(
153f0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  i=0, pItem=pGrou
15400 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70  pBy->a; i<pGroup
15410 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
15420 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
15430 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
15440 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  rty(pItem->pExpr
15450 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20  , EP_Agg) ){.   
15460 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15470 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 67  rMsg(pParse, "ag
15480 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
15490 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
154a0 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20  d in ".         
154b0 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59     "the GROUP BY
154c0 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20   clause");.     
154d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
154e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
154f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
15500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15510 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
15520 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
15530 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
15540 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
15550 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
15560 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
15570 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
15580 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
15590 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
155a0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
155b0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
155c0 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
155d0 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
155e0 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
155f0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
15600 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
15610 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
15620 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
15630 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
15640 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15650 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
15660 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
15670 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
15680 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
15690 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
156a0 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
156b0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
156c0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
156d0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
156e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
156f0 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75  ddOp(v, OP_MemNu
15700 6c 6c 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  ll, pAggInfo->aC
15710 6f 6c 5b 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a  ol[i].iMem, 0);.
15720 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
15730 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
15740 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
15750 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
15760 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
15770 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15780 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e  OP_MemNull, pFun
15790 63 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  c->iMem, 0);.   
157a0 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
157b0 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
157c0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
157d0 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
157e0 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d   if( pE->pList==
157f0 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e  0 || pE->pList->
15800 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
15810 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15820 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
15830 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61  TINCT in aggrega
15840 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  te must be follo
15850 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  wed ".          
15860 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73 69   "by an expressi
15870 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  on");.        pF
15880 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
15890 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
158a0 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
158b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
158c0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
158d0 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c  t(pParse, pE->pL
158e0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ist);.        sq
158f0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
15900 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15910 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
15920 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ct, 0, .        
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
15950 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
15960 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NDOFF);.      }.
15970 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15980 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
15990 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
159a0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
159b0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
159c0 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
159d0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
159e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
159f0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
15a00 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
15a10 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
15a20 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
15a30 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15a40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15a50 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
15a60 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
15a70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
15a80 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
15a90 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
15aa0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
15ab0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
15ac0 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71  r->pList;.    sq
15ad0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
15ae0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
15af0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
15b00 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
15b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
15b30 2d 3e 70 46 75 6e 63 2c 20 50 33 5f 46 55 4e 43  ->pFunc, P3_FUNC
15b40 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
15b50 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
15b60 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
15b70 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
15b80 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
15b90 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
15ba0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
15bb0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15bc0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
15bd0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
15be0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
15bf0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
15c00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
15c10 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
15c20 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
15c30 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
15c40 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
15c50 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
15c60 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
15c70 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
15c80 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
15c90 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
15ca0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
15cb0 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
15cc0 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
15cd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
15ce0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
15cf0 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ist;.    if( pLi
15d00 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
15d10 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
15d20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15d30 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
15d40 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20  Parse, pList);. 
15d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15d60 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nArg = 0;.    }.
15d70 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
15d80 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
15d90 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
15da0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15db0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
15dc0 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
15dd0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
15de0 74 28 76 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  t(v, pF->iDistin
15df0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 29  ct, addrNext, 1)
15e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15e10 70 46 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43  pF->pFunc->needC
15e20 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
15e30 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
15e40 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
15e50 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
15e60 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
15e70 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
15e80 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
15e90 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
15ea0 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
15eb0 6c 53 65 71 20 69 73 20 74 72 75 65 20 2a 2f 0a  lSeq is true */.
15ec0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
15ed0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
15ee0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
15ef0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
15f00 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
15f10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
15f20 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
15f30 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
15f40 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
15f50 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
15f60 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
15f70 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
15f80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15f90 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15fa0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
15fb0 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
15fc0 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
15fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15fe0 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op3(v, OP_AggSte
15ff0 70 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 6e 41 72  p, pF->iMem, nAr
16000 67 2c 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46  g, (void*)pF->pF
16010 75 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29  unc, P3_FUNCDEF)
16020 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
16030 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
16040 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
16050 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
16060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
16070 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
16080 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
16090 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
160a0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
160b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
160c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
160d0 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
160e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
160f0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 43 2d  OP_MemStore, pC-
16100 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 20  >iMem, 1);.  }. 
16110 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
16120 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  tMode = 0;.}.../
16130 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
16140 64 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  de for the given
16150 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16160 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  t..**.** The res
16170 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
16180 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
16190 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
161a0 6e 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  n the.** value o
161b0 66 20 65 44 65 73 74 20 61 6e 64 20 69 50 61 72  f eDest and iPar
161c0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 65 44 65  m..**.**     eDe
161d0 73 74 20 56 61 6c 75 65 20 20 20 20 20 20 20 52  st Value       R
161e0 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
161f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
16200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16220 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
16230 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 20 20 20  SRT_Callback    
16240 49 6e 76 6f 6b 65 20 74 68 65 20 63 61 6c 6c 62  Invoke the callb
16250 61 63 6b 20 66 6f 72 20 65 61 63 68 20 72 6f 77  ack for each row
16260 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
16270 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
16280 6d 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20  m         Store 
16290 66 69 72 73 74 20 72 65 73 75 6c 74 20 69 6e 20  first result in 
162a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 50 61 72  memory cell iPar
162b0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  m.**.**     SRT_
162c0 53 65 74 20 20 20 20 20 20 20 20 20 53 74 6f 72  Set         Stor
162d0 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b 65 79  e results as key
162e0 73 20 6f 66 20 74 61 62 6c 65 20 69 50 61 72 6d  s of table iParm
162f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
16300 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
16310 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
16320 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
16330 79 20 74 61 62 6c 65 20 69 50 61 72 6d 0a 2a 2a  y table iParm.**
16340 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
16350 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
16360 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
16370 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
16380 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  iParm..**.**    
16390 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20   SRT_Table      
163a0 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
163b0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
163c0 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 54 68  e iParm.**.** Th
163d0 65 20 74 61 62 6c 65 20 61 62 6f 76 65 20 69 73  e table above is
163e0 20 69 6e 63 6f 6d 70 6c 65 74 65 2e 20 20 41 64   incomplete.  Ad
163f0 64 69 74 69 6f 6e 61 6c 20 65 44 69 73 74 20 76  ditional eDist v
16400 61 6c 75 65 20 68 61 76 65 20 62 65 20 61 64 64  alue have be add
16410 65 64 0a 2a 2a 20 73 69 6e 63 65 20 74 68 69 73  ed.** since this
16420 20 63 6f 6d 6d 65 6e 74 20 77 61 73 20 77 72 69   comment was wri
16430 74 74 65 6e 2e 20 20 53 65 65 20 74 68 65 20 73  tten.  See the s
16440 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
16450 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 0a 2a 2a   function for.**
16460 20 61 20 63 6f 6d 70 6c 65 74 65 20 6c 69 73 74   a complete list
16470 69 6e 67 20 6f 66 20 74 68 65 20 61 6c 6c 6f 77  ing of the allow
16480 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44 65  ed values of eDe
16490 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65 61  st and their mea
164a0 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  nings..**.** Thi
164b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
164c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
164d0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
164e0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
164f0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
16500 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
16510 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
16520 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
16530 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
16540 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
16550 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
16560 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
16570 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
16580 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
16590 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
165a0 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  o that..**.** Th
165b0 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e  e pParent, paren
165c0 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72 65  tTab, and *pPare
165d0 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72 65  ntAgg fields are
165e0 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74 68   filled in if th
165f0 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73 20  is.** SELECT is 
16600 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  a subquery.  Thi
16610 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74 72  s routine may tr
16620 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 69  y to combine thi
16630 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  s SELECT.** with
16640 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20 66   its parent to f
16650 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  orm a single fla
16660 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f 20  t query.  In so 
16670 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74 0a  doing, it might.
16680 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ** change the pa
16690 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d 20  rent query from 
166a0 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  a non-aggregate 
166b0 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  to an aggregate 
166c0 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74 68  query..** For th
166d0 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 70  at reason, the p
166e0 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20 69  ParentAgg flag i
166f0 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70 6f  s passed as a po
16700 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a 20  inter, so it.** 
16710 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  can be changed..
16720 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
16730 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f     The meaning o
16740 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 61  f the pParent pa
16750 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  rameter..**.**  
16760 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
16770 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20  t1 JOIN (SELECT 
16780 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  x, count(*) FROM
16790 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a 2a   t2) JOIN t3;.**
167a0 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20      \           
167b0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
167c0 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
167d0 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a 2a  ____/        /.*
167e0 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20 20  *     \         
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a               /.*
16820 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  *      \________
16830 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
16840 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
16850 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
16860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16870 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74   is called for t
16880 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 66  he outer query f
16890 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61 74  irst.   For that
168a0 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65 6e   call,.** pParen
168b0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e 20  t will be NULL. 
168c0 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f 63   During the proc
168d0 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f 75  essing of the ou
168e0 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73 20  ter query, this 
168f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
16900 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
16910 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  y to handle the 
16920 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20 74  subquery.  For t
16930 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
16940 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77 69  call, pParent wi
16950 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ll point to the 
16960 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
16970 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75 65  cause the subque
16980 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65 63  ry is.** the sec
16990 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20 61  ond element in a
169a0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 2c   three-way join,
169b0 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20 70   the parentTab p
169c0 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a 2a  arameter will.**
169d0 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20 76   be 1 (the 2nd v
169e0 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64 65  alue of a 0-inde
169f0 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a 69  xed array.).*/.i
16a00 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
16a10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
16a20 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
16a30 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
16a40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a60 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
16a70 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
16a80 2e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  . */.  int eDest
16a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
16aa0 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
16ab0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  of the results *
16ac0 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
16ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16ae0 70 61 72 61 6d 65 74 65 72 20 75 73 65 64 20 62  parameter used b
16af0 79 20 74 68 65 20 65 44 65 73 74 20 64 69 73 70  y the eDest disp
16b00 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
16b10 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
16b20 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ,       /* Anoth
16b30 65 72 20 53 45 4c 45 43 54 20 66 6f 72 20 77 68  er SELECT for wh
16b40 69 63 68 20 74 68 69 73 20 69 73 20 61 20 73 75  ich this is a su
16b50 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  b-query */.  int
16b60 20 70 61 72 65 6e 74 54 61 62 2c 20 20 20 20 20   parentTab,     
16b70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
16b80 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 6f 66  pParent->pSrc of
16b90 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20   this query */. 
16ba0 20 69 6e 74 20 2a 70 50 61 72 65 6e 74 41 67 67   int *pParentAgg
16bb0 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
16bc0 69 66 20 70 50 61 72 65 6e 74 20 75 73 65 73 20  if pParent uses 
16bd0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
16be0 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ons */.  char *a
16bf0 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ff              
16c00 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53  /* If eDest is S
16c10 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66  RT_Union, the af
16c20 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f  finity string */
16c30 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
16c60 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
16c70 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74  Info;     /* Ret
16c80 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  urn from sqlite3
16c90 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
16ca0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
16cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16cc0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
16cd0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
16ce0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  on */.  int isAg
16cf0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
16d00 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63  * True for selec
16d10 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f  t lists like "co
16d20 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70  unt(*)" */.  Exp
16d30 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
16d40 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
16d50 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63  olumns to extrac
16d60 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  t. */.  SrcList 
16d70 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f  *pTabList;     /
16d80 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
16d90 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20   to select from 
16da0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72  */.  Expr *pWher
16db0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
16dc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
16dd0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
16de0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
16df0 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  derBy;    /* The
16e00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16e10 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
16e20 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
16e30 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
16e40 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
16e50 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
16e60 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
16e70 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
16e80 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
16e90 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
16ea0 2f 0a 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e  /.  int isDistin
16eb0 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
16ec0 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
16ed0 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
16ee0 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64  esent */.  int d
16ef0 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
16f00 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73    /* Table to us
16f10 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
16f20 63 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  ct set */.  int 
16f30 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
16f40 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
16f50 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
16f60 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
16f70 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
16f80 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16f90 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
16fa0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
16fb0 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  on */.  AggInfo 
16fc0 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
16fd0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
16fe0 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
16ff0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
17000 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
17010 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17020 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
17030 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
17040 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   p==0 || sqlite3
17050 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 7c  MallocFailed() |
17060 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
17070 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
17080 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
17090 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
170a0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
170b0 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
170c0 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
170d0 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
170e0 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
170f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17100 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
17110 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
17120 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
17130 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
17140 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
17150 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
17160 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
17170 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r ){.    if( p->
17180 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b  pRightmost==0 ){
17190 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
171a0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  Loop;.      for(
171b0 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
171c0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
171d0 69 6f 72 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  ior){.        pL
171e0 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
171f0 3d 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = p;.      }.   
17200 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75   }.    return mu
17210 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
17220 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
17230 6d 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 23 65 6e  m, aff);.  }.#en
17240 64 69 66 0a 0a 20 20 70 4f 72 64 65 72 42 79 20  dif..  pOrderBy 
17250 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
17260 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
17270 64 65 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a  derby(eDest) ){.
17280 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
17290 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
172a0 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f  qlite3SelectReso
172b0 6c 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30  lve(pParse, p, 0
172c0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
172d0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  lect_end;.  }.  
172e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
172f0 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4d 61  rderBy;..  /* Ma
17300 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
17310 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
17320 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
17330 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
17340 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
17350 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
17360 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  e;.  pGroupBy = 
17370 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
17380 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
17390 69 6e 67 3b 0a 20 20 69 73 41 67 67 20 3d 20 70  ing;.  isAgg = p
173a0 2d 3e 69 73 41 67 67 3b 0a 20 20 69 73 44 69 73  ->isAgg;.  isDis
173b0 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
173c0 74 69 6e 63 74 3b 0a 20 20 70 45 4c 69 73 74 20  tinct;.  pEList 
173d0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
173e0 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
173f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
17400 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
17410 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
17420 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
17430 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
17440 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
17450 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
17460 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
17470 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
17480 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17490 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
174a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
174b0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
174c0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
174d0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
174e0 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
174f0 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
17500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17510 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
17520 28 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  ( (eDest==SRT_Me
17530 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
17540 53 65 74 29 20 26 26 20 70 45 4c 69 73 74 2d 3e  Set) && pEList->
17550 6e 45 78 70 72 3e 31 20 29 7b 0a 20 20 20 20 73  nExpr>1 ){.    s
17560 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17570 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73  Parse, "only a s
17580 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c  ingle result all
17590 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20  owed for ".     
175a0 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61 74    "a SELECT that
175b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
175c0 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20  xpression");.   
175d0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
175e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
175f0 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69  /* ORDER BY is i
17600 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20  gnored for some 
17610 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20  destinations..  
17620 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  */.  if( Ignorab
17630 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74 29  leOrderby(eDest)
17640 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
17650 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
17660 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
17670 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
17680 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
17690 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
176a0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
176b0 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65  ct_end;..  /* Ge
176c0 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
176d0 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
176e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
176f0 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
17700 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17710 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
17720 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17730 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
17740 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
17750 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
17760 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
17770 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
17780 30 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 52  0;.    int needR
17790 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 3b 0a 20  estoreContext;. 
177a0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
177b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
177c0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
177d0 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
177e0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70  >pSelect==0 || p
177f0 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
17800 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
17810 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
17820 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  me!=0 ){.      z
17830 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
17840 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
17850 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 70  Context;.      p
17860 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
17870 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ext = pItem->zNa
17880 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64 52 65  me;.      needRe
17890 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d 20 31  storeContext = 1
178a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
178b0 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
178c0 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ntext = 0;.    }
178d0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
178e0 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  ct(pParse, pItem
178f0 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 45  ->pSelect, SRT_E
17900 70 68 65 6d 54 61 62 2c 20 0a 20 20 20 20 20 20  phemTab, .      
17910 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
17920 2d 3e 69 43 75 72 73 6f 72 2c 20 70 2c 20 69 2c  ->iCursor, p, i,
17930 20 26 69 73 41 67 67 2c 20 30 29 3b 0a 20 20 20   &isAgg, 0);.   
17940 20 69 66 28 20 6e 65 65 64 52 65 73 74 6f 72 65   if( needRestore
17950 43 6f 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 20  Context ){.     
17960 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17970 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
17980 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 7d  thContext;.    }
17990 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
179a0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 57 68  p->pSrc;.    pWh
179b0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
179c0 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
179d0 62 6c 65 4f 72 64 65 72 62 79 28 65 44 65 73 74  bleOrderby(eDest
179e0 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
179f0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
17a00 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 47 72  y;.    }.    pGr
17a10 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
17a20 70 42 79 3b 0a 20 20 20 20 70 48 61 76 69 6e 67  pBy;.    pHaving
17a30 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
17a40 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
17a50 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
17a60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
17a70 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 73 70  Check for the sp
17a80 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20  ecial case of a 
17a90 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66  min() or max() f
17aa0 75 6e 63 74 69 6f 6e 20 62 79 20 69 74 73 65 6c  unction by itsel
17ab0 66 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  f.  ** in the re
17ac0 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  sult set..  */. 
17ad0 20 69 66 28 20 73 69 6d 70 6c 65 4d 69 6e 4d 61   if( simpleMinMa
17ae0 78 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  xQuery(pParse, p
17af0 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 29 20  , eDest, iParm) 
17b00 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
17b10 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17b20 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  nd;.  }..  /* Ch
17b30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
17b40 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79  is is a subquery
17b50 20 74 68 61 74 20 63 61 6e 20 62 65 20 22 66 6c   that can be "fl
17b60 61 74 74 65 6e 65 64 22 20 69 6e 74 6f 20 69 74  attened" into it
17b70 73 20 70 61 72 65 6e 74 2e 0a 20 20 2a 2a 20 49  s parent..  ** I
17b80 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
17b90 61 20 70 6f 73 73 69 62 6c 69 74 79 2c 20 64 6f  a possiblity, do
17ba0 20 73 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 69   so and return i
17bb0 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 0a 20 20  mmediately.  .  
17bc0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17bd0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
17be0 28 20 70 50 61 72 65 6e 74 20 26 26 20 70 50 61  ( pParent && pPa
17bf0 72 65 6e 74 41 67 67 20 26 26 0a 20 20 20 20 20  rentAgg &&.     
17c00 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
17c10 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
17c20 54 61 62 2c 20 2a 70 50 61 72 65 6e 74 41 67 67  Tab, *pParentAgg
17c30 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  , isAgg) ){.    
17c40 69 66 28 20 69 73 41 67 67 20 29 20 2a 70 50 61  if( isAgg ) *pPa
17c50 72 65 6e 74 41 67 67 20 3d 20 31 3b 0a 20 20 20  rentAgg = 1;.   
17c60 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17c70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17c80 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
17c90 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
17ca0 65 2c 20 72 65 73 6f 6c 76 65 20 61 6e 79 20 63  e, resolve any c
17cb0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
17cc0 65 73 0a 20 20 2a 2a 20 6e 61 6d 65 73 20 74 68  es.  ** names th
17cd0 61 74 20 68 61 76 65 20 62 65 65 6e 20 65 78 70  at have been exp
17ce0 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65  licitly specifie
17cf0 64 20 61 6e 64 20 63 72 65 61 74 65 20 61 20 73  d and create a s
17d00 6f 72 74 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20  orting index..  
17d10 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 6f 72  **.  ** This sor
17d20 74 69 6e 67 20 69 6e 64 65 78 20 6d 69 67 68 74  ting index might
17d30 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
17d40 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
17d50 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
17d60 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
17d70 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
17d80 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
17d90 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
17da0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
17db0 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
17dc0 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
17dd0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
17de0 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
17df0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
17e00 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
17e10 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
17e20 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
17e30 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
17e40 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
17e50 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
17e60 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
17e70 79 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  y ){.    struct 
17e80 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
17e90 54 65 72 6d 3b 0a 20 20 20 20 4b 65 79 49 6e 66  Term;.    KeyInf
17ea0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
17eb0 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
17ec0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
17ed0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
17ee0 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
17ef0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
17f00 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
17f10 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
17f20 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Coll = sqlite3Lo
17f30 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
17f40 73 65 2c 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65  se, pTerm->zName
17f50 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
17f60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17f70 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
17f80 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
17f90 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b  nd;.    }.    pK
17fa0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
17fb0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
17fc0 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
17fd0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
17fe0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17ff0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
18000 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
18010 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
18020 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  =.       sqlite3
18030 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
18040 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4f 72  enEphemeral, pOr
18050 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
18060 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
18070 2b 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  +2, .           
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
18090 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
180a0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
180b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
180c0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
180d0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
180e0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
180f0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
18100 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
18110 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
18120 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
18130 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
18140 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18150 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65  eAddOp(v, OP_Ope
18160 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72  nEphemeral, iPar
18170 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
18180 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
18190 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
181a0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
181b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
181c0 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
181d0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
181e0 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a  rse, p, iEnd);..
181f0 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
18200 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
18210 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
18220 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
18230 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
18240 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
18250 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69  yInfo;.    disti
18260 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
18270 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
18280 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
18290 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
182a0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
182b0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
182c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
182d0 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30  ral, distinct, 0
182e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
182f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
18300 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
18310 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
18320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
18330 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
18340 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
18350 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
18360 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
18370 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
18380 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
18390 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
183a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
183b0 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e   case is for non
183c0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
183d0 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  es.    ** Begin 
183e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
183f0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49  n.    */.    pWI
18400 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
18410 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
18420 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
18430 2c 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  , &pOrderBy);.  
18440 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
18450 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
18460 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  d;..    /* If so
18470 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
18480 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
18490 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
184a0 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
184b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
184c0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
184d0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
184e0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
184f0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
18500 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
18510 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18520 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
18530 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
18540 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18550 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
18560 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
18570 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e  x, 1);.      p->
18580 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
18590 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
185a0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
185b0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a  dard inner loop.
185c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
185d0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
185e0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
185f0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
18600 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73  , distinct, eDes
18610 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
18620 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57         iParm, pW
18630 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c  Info->iContinue,
18640 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c   pWInfo->iBreak,
18650 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20   aff) ){.       
18660 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
18670 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
18680 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
18690 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
186a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
186b0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
186c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
186d0 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
186e0 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
186f0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
18700 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
18710 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
18720 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
18730 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
18740 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18750 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
18760 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
18770 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
18780 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
18790 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
187a0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
187b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
187c0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
187d0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
187e0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
187f0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
18800 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
18810 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
18820 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18840 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
18850 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
18860 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
18870 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
188a0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
188b0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
188c0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
188d0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
188e0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
188f0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
18900 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
18910 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
18920 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
18930 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20  der */...    /* 
18940 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
18950 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64  riables hold add
18960 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73  resses or labels
18970 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68   for parts of th
18980 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  e.    ** virtual
18990 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d   machine program
189a0 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20   we are putting 
189b0 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20  together */.    
189c0 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
189d0 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  w;      /* Start
189e0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
189f0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
18a00 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
18a10 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
18a20 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ;       /* Set t
18a30 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
18a40 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
18a50 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69  int addrInitiali
18a60 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74  zeLoop; /* Start
18a70 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e   of code that in
18a80 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e  itializes the in
18a90 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
18aa0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
18ab0 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  p;      /* Top o
18ac0 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
18ad0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18ae0 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20  GroupByChange;  
18af0 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e  /* Code that run
18b00 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50  s when any GROUP
18b10 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73   BY term changes
18b20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
18b30 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20  ProcessRow;     
18b40 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65  /* Code to proce
18b50 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75  ss a single inpu
18b60 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
18b70 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
18b80 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61       /* End of a
18b90 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  ll processing */
18ba0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72  .    int addrSor
18bb0 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20  tingIdx;     /* 
18bc0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
18bd0 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
18be0 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
18bf0 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
18c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
18c10 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
18c20 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
18c30 6c 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64  lator */..    ad
18c40 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
18c50 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18c60 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
18c70 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
18c80 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
18c90 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
18ca0 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
18cb0 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
18cc0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
18cd0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
18ce0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
18cf0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
18d00 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
18d10 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
18d20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
18d30 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
18d40 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
18d50 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
18d60 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67  st;.    sNC.pAgg
18d70 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f  Info = &sAggInfo
18d80 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
18d90 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
18da0 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
18db0 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30  pBy->nExpr+1 : 0
18dc0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
18dd0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
18de0 42 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  By;.    if( sqli
18df0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
18e00 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
18e10 73 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  st) ){.      got
18e20 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18e30 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18e40 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
18e50 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
18e60 65 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67  erBy) ){.      g
18e70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48      }.    if( pH
18e90 61 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33  aving && sqlite3
18ea0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
18eb0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
18ec0 69 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  ing) ){.      go
18ed0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18ee0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
18ef0 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
18f00 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
18f10 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
18f20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
18f30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
18f40 28 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  ( sqlite3ExprAna
18f50 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
18f60 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
18f70 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74  [i].pExpr->pList
18f80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
18f90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18fb0 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  if( sqlite3Mallo
18fc0 63 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f  cFailed() ) goto
18fd0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
18fe0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
18ff0 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
19000 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
19010 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
19020 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
19030 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 20  ore complex tha 
19040 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
19050 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
19060 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
19070 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
19080 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
19090 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
190a0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
190b0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
190c0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43  e */..      /* C
190d0 72 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61  reate labels tha
190e0 74 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65  t we will be nee
190f0 64 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ding.      */.  
19100 20 20 20 0a 20 20 20 20 20 20 61 64 64 72 49 6e     .      addrIn
19110 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73  itializeLoop = s
19120 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19130 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64  bel(v);.      ad
19140 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 20  drGroupByChange 
19150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19160 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
19170 20 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 20   addrProcessRow 
19180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19190 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
191a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
191b0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
191c0 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
191d0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
191e0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
191f0 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
19200 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
19210 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
19220 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
19230 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
19240 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
19250 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65  ter all, the Ope
19260 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
19270 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
19280 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
19290 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
192a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
192b0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
192c0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
192d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
192e0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
192f0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
19300 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
19310 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
19320 64 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  dx =.          s
19330 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
19340 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
19350 6c 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  l, sAggInfo.sort
19360 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20  ingIdx,.        
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
19390 6e 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  ngColumn,.      
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
193c0 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P3_KEYINFO_H
193d0 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
193e0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
193f0 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
19400 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
19410 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
19420 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
19430 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70      iUseFlag = p
19440 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
19450 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
19460 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
19470 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
19480 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19490 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
194a0 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
194b0 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
194c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
194d0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
194e0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
194f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
19500 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19510 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20  , OP_MemInt, 0, 
19520 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
19530 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19540 76 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f 72  v, "# clear abor
19550 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
19560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19570 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
19580 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
19590 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
195a0 28 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20  (v, "# indicate 
195b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
195c0 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
195d0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
195e0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
195f0 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b  InitializeLoop);
19600 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
19610 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19620 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
19630 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
19640 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
19650 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
19660 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
19670 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
19680 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
19690 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
196a0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
196b0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
196c0 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
196d0 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
196e0 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
196f0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
19700 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
19710 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
19720 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
19730 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
19740 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
19750 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
19760 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
19770 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
19780 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
19790 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
197a0 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
197b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
197c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
197d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
197e0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74  dOp(v, OP_MemInt
197f0 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
19800 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
19810 65 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20 61  ent((v, "# set a
19820 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
19830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19840 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
19850 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
19860 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
19870 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
19880 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
19890 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
198a0 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73  p(v, OP_IfMemPos
198b0 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
198c0 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
198d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
198e0 28 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20 72  (v, "# Groupby r
198f0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
19900 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
19910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19920 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74  eAddOp(v, OP_Ret
19930 75 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  urn, 0, 0);.    
19940 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
19950 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
19960 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
19970 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
19980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19990 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
199a0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
199b0 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b  OutputRow+1, 1);
199c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
199d0 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  c = selectInnerL
199e0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
199f0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
19a00 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 65       distinct, e
19a30 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20  Dest, iParm, .  
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
19a60 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
19a70 74 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20  tAbort, aff);.  
19a80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19a90 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
19aa0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
19ab0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19ac0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
19ad0 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
19ae0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19af0 20 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79 20   "# end groupby 
19b00 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
19b10 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
19b20 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
19b30 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
19b40 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
19b50 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
19b60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
19b70 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
19b80 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19b90 76 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  v);.      resetA
19ba0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
19bb0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
19bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19bd0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
19be0 72 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rn, 0, 0);..    
19bf0 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
19c00 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
19c10 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
19c20 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
19c30 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
19c40 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
19c50 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
19c60 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
19c70 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
19c80 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
19c90 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
19ca0 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
19cb0 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
19cc0 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
19cd0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
19ce0 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
19cf0 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
19d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
19d10 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19d20 62 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69  bel(v, addrIniti
19d30 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20  alizeLoop);.    
19d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19d50 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
19d60 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  0, addrReset);. 
19d70 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
19d80 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
19d90 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
19da0 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75  , pWhere, &pGrou
19db0 70 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBy);.      if( 
19dc0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
19dd0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
19de0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d     if( pGroupBy=
19df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
19e00 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
19e10 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
19e20 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
19e30 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
19e40 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
19e50 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
19e60 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
19e70 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
19e80 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
19e90 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
19ea0 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
19eb0 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
19ec0 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
19ed0 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75  */.        pGrou
19ee0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
19ef0 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  y;.        group
19f00 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
19f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19f20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
19f30 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
19f40 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
19f50 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
19f60 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
19f70 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
19f80 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
19f90 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
19fa0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
19fb0 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
19fc0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
19fd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
19fe0 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
19ff0 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
1a000 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
1a010 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
1a020 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
1a030 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1a040 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
1a050 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
1a060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a070 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75  AddOp(v, OP_Sequ
1a080 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73  ence, sAggInfo.s
1a090 6f 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20  ortingIdx, 0);. 
1a0a0 20 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f 75         j = pGrou
1a0b0 70 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20  pBy->nExpr+1;.  
1a0c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1a0d0 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
1a0e0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1a0f0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
1a100 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73  o_col *pCol = &s
1a110 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b  AggInfo.aCol[i];
1a120 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a130 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
1a140 6d 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mn<j ) continue;
1a150 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a160 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  Col->iColumn<0 )
1a170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1a180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a190 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c  , OP_Rowid, pCol
1a1a0 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
1a1b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a1c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a1d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a1e0 50 5f 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  P_Column, pCol->
1a1f0 69 54 61 62 6c 65 2c 20 70 43 6f 6c 2d 3e 69 43  iTable, pCol->iC
1a200 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
1a210 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 2b    }.          j+
1a220 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1a230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a240 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
1a250 52 65 63 6f 72 64 2c 20 6a 2c 20 30 29 3b 0a 20  Record, j, 0);. 
1a260 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a270 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
1a280 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  xInsert, sAggInf
1a290 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 30 29  o.sortingIdx, 0)
1a2a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a2b0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1a2c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a2d0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a2e0 50 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  P_Sort, sAggInfo
1a2f0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
1a300 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
1a310 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a320 23 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22  # GROUP BY sort"
1a330 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  ));.        sAgg
1a340 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
1a350 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  dx = 1;.      }.
1a360 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
1a370 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
1a380 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
1a390 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
1a3a0 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
1a3b0 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
1a3c0 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
1a3d0 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
1a3e0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
1a3f0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
1a400 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
1a410 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
1a420 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
1a430 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
1a440 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
1a450 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
1a460 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
1a470 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
1a480 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
1a490 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
1a4a0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
1a4b0 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  r(v);.      for(
1a4c0 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d  j=0; j<pGroupBy-
1a4d0 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
1a4e0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
1a4f0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
1a500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a510 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
1a520 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1a530 6e 67 49 64 78 2c 20 6a 29 3b 0a 20 20 20 20 20  ngIdx, j);.     
1a540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a550 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
1a560 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
1a570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1a580 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1a590 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
1a5a0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
1a5b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a5c0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a5d0 65 6d 53 74 6f 72 65 2c 20 69 42 4d 65 6d 2b 6a  emStore, iBMem+j
1a5e0 2c 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  , j<pGroupBy->nE
1a5f0 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xpr-1);.      }.
1a600 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 47 72 6f        for(j=pGro
1a610 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 6a  upBy->nExpr-1; j
1a620 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
1a630 20 20 20 69 66 28 20 6a 3c 70 47 72 6f 75 70 42     if( j<pGroupB
1a640 79 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20  y->nExpr-1 ){.  
1a650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a660 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1a670 65 6d 4c 6f 61 64 2c 20 69 42 4d 65 6d 2b 6a 2c  emLoad, iBMem+j,
1a680 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
1a690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a6a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1a6b0 6d 4c 6f 61 64 2c 20 69 41 4d 65 6d 2b 6a 2c 20  mLoad, iAMem+j, 
1a6c0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1a6d0 6a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  j==0 ){.        
1a6e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a6f0 4f 70 28 76 2c 20 4f 50 5f 45 71 2c 20 30 78 32  Op(v, OP_Eq, 0x2
1a700 30 30 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52  00, addrProcessR
1a710 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ow);.        }el
1a720 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
1a730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a740 2c 20 4f 50 5f 4e 65 2c 20 30 78 32 30 30 2c 20  , OP_Ne, 0x200, 
1a750 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1a760 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1a770 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a780 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
1a790 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
1a7a0 2d 3e 61 43 6f 6c 6c 5b 6a 5d 2c 20 50 33 5f 43  ->aColl[j], P3_C
1a7b0 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
1a7c0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
1a7d0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
1a7e0 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
1a7f0 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
1a800 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
1a810 65 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  e in the GROUP B
1a820 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
1a830 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
1a840 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
1a850 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
1a860 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
1a870 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
1a880 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
1a890 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
1a8a0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
1a8b0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
1a8c0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
1a8d0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
1a8e0 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
1a8f0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
1a900 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
1a910 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
1a920 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
1a930 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
1a940 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
1a950 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
1a960 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
1a970 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
1a980 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1a990 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a9a0 62 65 6c 28 76 2c 20 61 64 64 72 47 72 6f 75 70  bel(v, addrGroup
1a9b0 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1a9c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
1a9d0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
1a9e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a9f0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1aa00 50 5f 4d 65 6d 4d 6f 76 65 2c 20 69 41 4d 65 6d  P_MemMove, iAMem
1aa10 2b 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  +j, iBMem+j);.  
1aa20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1aa30 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1aa40 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64  OP_Gosub, 0, add
1aa50 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
1aa60 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1aa70 76 2c 20 22 23 20 6f 75 74 70 75 74 20 6f 6e 65  v, "# output one
1aa80 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
1aa90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1aaa0 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20  v, OP_IfMemPos, 
1aab0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
1aac0 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
1aad0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 63  Comment((v, "# c
1aae0 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
1aaf0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
1ab00 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1ab10 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 52  _Gosub, 0, addrR
1ab20 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
1ab30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
1ab40 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
1ab50 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
1ab60 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
1ab70 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1ab80 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
1ab90 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
1aba0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
1abb0 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
1abc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1abd0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1abe0 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20  rProcessRow);.  
1abf0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
1ac00 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1ac10 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1ac20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ac30 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
1ac40 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
1ac50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1ac60 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 64  v, "# indicate d
1ac70 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
1ac80 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
1ac90 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
1aca0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1acb0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
1acc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1acd0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1ace0 50 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  P_Next, sAggInfo
1acf0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
1ad00 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
1ad10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ad20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1ad30 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
1ad40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1ad50 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
1ad60 64 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29  drSortingIdx, 1)
1ad70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1ad80 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
1ad90 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
1ada0 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
1adb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1adc0 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  Op(v, OP_Gosub, 
1add0 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  0, addrOutputRow
1ade0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1adf0 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74 70  ment((v, "# outp
1ae00 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
1ae10 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  .      .    } /*
1ae20 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20   endif pGroupBy 
1ae30 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
1ae40 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1ae50 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
1ae60 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
1ae70 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1ae80 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  The.      ** pro
1ae90 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
1aea0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
1aeb0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
1aec0 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 2a  ngle row.      *
1aed0 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
1aee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65     */.      rese
1aef0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
1af00 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1af10 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
1af20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1af30 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1af40 73 74 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  st, pWhere, 0);.
1af50 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
1af60 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1af70 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 75 70 64  t_end;.      upd
1af80 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
1af90 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1afa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1afb0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1afc0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
1afd0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
1afe0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1aff0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
1b000 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
1b010 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
1b020 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1b030 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
1b040 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 31  ving, addrEnd, 1
1b050 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b060 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1b070 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
1b080 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
1b090 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
1b0a0 20 20 20 20 20 20 20 20 20 20 20 65 44 65 73 74             eDest
1b0b0 2c 20 69 50 61 72 6d 2c 20 61 64 64 72 45 6e 64  , iParm, addrEnd
1b0c0 2c 20 61 64 64 72 45 6e 64 2c 20 61 66 66 29 3b  , addrEnd, aff);
1b0d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1b0e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b0f0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
1b100 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
1b110 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
1b120 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
1b130 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1b140 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1b150 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
1b160 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
1b170 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
1b180 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
1b190 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
1b1a0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1b1b0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
1b1c0 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
1b1d0 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
1b1e0 70 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  pr, eDest, iParm
1b1f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
1b200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b210 55 45 52 59 0a 20 20 2f 2a 20 49 66 20 74 68 69  UERY.  /* If thi
1b220 73 20 77 61 73 20 61 20 73 75 62 71 75 65 72 79  s was a subquery
1b230 2c 20 77 65 20 68 61 76 65 20 6e 6f 77 20 63 6f  , we have now co
1b240 6e 76 65 72 74 65 64 20 74 68 65 20 73 75 62 71  nverted the subq
1b250 75 65 72 79 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  uery into a.  **
1b260 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b270 2e 20 20 53 6f 20 73 65 74 20 74 68 65 20 53 72  .  So set the Sr
1b280 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73 50 6f 70  cList_item.isPop
1b290 75 6c 61 74 65 64 20 66 6c 61 67 20 74 6f 20 70  ulated flag to p
1b2a0 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74 68 69 73  revent.  ** this
1b2b0 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
1b2c0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
1b2d0 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
1b2e0 65 20 74 68 65 20 75 73 65 20 6f 66 0a 20 20 2a  e the use of.  *
1b2f0 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
1b300 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
1b310 28 20 70 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  ( pParent ){.   
1b320 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1b330 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 70 61 72  ->pSrc->nSrc>par
1b340 65 6e 74 54 61 62 20 29 3b 0a 20 20 20 20 61 73  entTab );.    as
1b350 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1b360 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62  Src->a[parentTab
1b370 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20 29 3b 0a  ].pSelect==p );.
1b380 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1b390 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1b3a0 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1b3b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1b3c0 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
1b3d0 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
1b3e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b3f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1b400 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
1b410 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
1b420 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
1b430 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
1b440 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
1b450 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
1b460 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
1b470 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
1b480 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
1b490 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
1b4a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
1b4b0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
1b4c0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
1b4d0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
1b4e0 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
1b4f0 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  nd:..  /* Identi
1b500 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
1b510 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  if we will be us
1b520 69 6e 67 20 74 68 65 6d 20 69 6e 20 61 20 63 61  ing them in a ca
1b530 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20  llback.  This.  
1b540 2a 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70  ** step is skipp
1b550 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
1b560 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 73 6f 6d   is going to som
1b570 65 20 6f 74 68 65 72 20 64 65 73 74 69 6e 61 74  e other destinat
1b580 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
1b590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b5a0 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
1b5b0 62 61 63 6b 20 29 7b 0a 20 20 20 20 67 65 6e 65  back ){.    gene
1b5c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1b5d0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1b5e0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
1b5f0 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 41 67    sqliteFree(sAg
1b600 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
1b610 71 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e  qliteFree(sAggIn
1b620 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
1b630 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.