/ Hex Artifact Content
Login

Artifact 05081fdfdb5f6a1397079097e02f9a76a9ce4019:


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 32 37  select.c,v 1.327
0200: 20 32 30 30 37 2f 30 32 2f 31 34 20 30 39 3a 31   2007/02/14 09:1
0210: 39 3a 33 36 20 64 61 6e 69 65 6c 6b 31 39 37 37  9:36 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 4f 72 46 72 65 65 28 54 4b 5f 44 4f 54  xprOrFree(TK_DOT
1850: 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29  , pE1b, pE1a, 0)
1860: 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74  ;.  pE2c = sqlit
1870: 65 33 45 78 70 72 4f 72 46 72 65 65 28 54 4b 5f  e3ExprOrFree(TK_
1880: 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c  DOT, pE2b, pE2a,
1890: 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69   0);.  pE = sqli
18a0: 74 65 33 45 78 70 72 4f 72 46 72 65 65 28 54 4b  te3ExprOrFree(TK
18b0: 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c  _EQ, pE1c, pE2c,
18c0: 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20 29 7b   0);.  if( pE ){
18d0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
18e0: 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
18f0: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69  Join);.    pE->i
1900: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1910: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
1920: 3b 0a 20 20 7d 0a 20 20 70 45 20 3d 20 73 71 6c  ;.  }.  pE = sql
1930: 69 74 65 33 45 78 70 72 41 6e 64 28 2a 70 70 45  ite3ExprAnd(*ppE
1940: 78 70 72 2c 20 70 45 29 3b 0a 20 20 69 66 28 20  xpr, pE);.  if( 
1950: 70 45 20 29 7b 0a 20 20 20 20 2a 70 70 45 78 70  pE ){.    *ppExp
1960: 72 20 3d 20 70 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r = pE;.  }.}../
1970: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
1980: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
1990: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
19a0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
19b0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
19c0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
19d0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
19e0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
19f0: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
1a00: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
1a10: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
1a20: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
1a30: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
1a40: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
1a50: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
1a60: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
1a70: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
1a80: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
1a90: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
1aa0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
1ab0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
1ac0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
1ad0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
1ae0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
1af0: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
1b00: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
1b10: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
1b20: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
1b30: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
1b40: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
1b50: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
1b60: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
1b70: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
1b80: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
1b90: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
1ba0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
1bb0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
1bc0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1bd0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
1be0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
1bf0: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
1c00: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
1c10: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
1c20: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
1c30: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
1c40: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
1c50: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
1c60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
1c70: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
1c80: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1c90: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1ca0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
1cb0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
1cc0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
1cd0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
1ce0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
1cf0: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
1d00: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
1d10: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
1d20: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
1d30: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
1d40: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
1d50: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
1d60: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
1d70: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
1d80: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
1d90: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
1da0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
1db0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
1dc0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
1dd0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
1de0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
1df0: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
1e00: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
1e10: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
1e20: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
1e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1e40: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
1e50: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
1e60: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
1e70: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1e80: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
1e90: 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74  );.    p->iRight
1ea0: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62  JoinTable = iTab
1eb0: 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45  le;.    setJoinE
1ec0: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
1ed0: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
1ee0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
1ef0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f00: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
1f10: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
1f20: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
1f30: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
1f40: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1f50: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
1f60: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
1f70: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
1f80: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
1f90: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
1fa0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
1fb0: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
1fc0: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
1fd0: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
1fe0: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
1ff0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
2000: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
2010: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
2020: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
2030: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
2040: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
2050: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
2060: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
2070: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
2080: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
2090: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
20a0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
20b0: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
20c0: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
20d0: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
20e0: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
20f0: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
2100: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2110: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
2120: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
2130: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
2140: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
2150: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
2160: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2170: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2180: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
2190: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21a0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
21b0: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
21c0: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
21d0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
2200: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2210: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2240: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
2250: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2260: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
2270: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
2280: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
2290: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
22a0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
22b0: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
22c0: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
22d0: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
22e0: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
22f0: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
2300: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
2310: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
2320: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
2330: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
2340: 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54     Table *pLeftT
2350: 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62  ab = pLeft->pTab
2360: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69  ;.    Table *pRi
2370: 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d  ghtTab = pRight-
2380: 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28 20  >pTab;..    if( 
2390: 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70  pLeftTab==0 || p
23a0: 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f  RightTab==0 ) co
23b0: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
23c0: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
23d0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
23e0: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
23f0: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
2400: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
2410: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
2420: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
2430: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
2440: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
2450: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2460: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2470: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
2480: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
24a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
24b0: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
24c0: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
24d0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
24e0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
24f0: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2500: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2510: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2520: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
2530: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2540: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
2550: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
2560: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2570: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
2580: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
2590: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
25a0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
25b0: 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62  (zName, pLeftTab
25c0: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
25d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
2600: 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  t->zAlias,.     
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
2630: 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57  >iCursor, &p->pW
2640: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20  here);.         
2650: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
2660: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2670: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
2680: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
2690: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
26a0: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
26b0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
26c0: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
26d0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
26e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26f0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
2700: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2710: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
2720: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2730: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
2740: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2750: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
2760: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
2770: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
2780: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
2790: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
27a0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
27b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
27c0: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
27d0: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
27e0: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
27f0: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
2800: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
2810: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
2820: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2830: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2840: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2850: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2860: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2870: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2880: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2890: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
28a0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
28b0: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
28c0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
28d0: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
28e0: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
28f0: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2900: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2910: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2920: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2930: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2940: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2950: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2960: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2970: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2980: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2990: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
29a0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
29b0: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
29c0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
29d0: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
29e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
29f0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
2a00: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
2a10: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
2a20: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
2a30: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
2a40: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
2a50: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
2a60: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
2a70: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
2a80: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
2a90: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
2aa0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2ab0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
2ac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2ad0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ae0: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
2af0: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
2b00: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
2b10: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
2b20: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
2b30: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
2b40: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2b50: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2b60: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
2b70: 72 6d 28 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  rm(zName, pLeftT
2b80: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
2b90: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
2bc0: 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  t->zAlias,.     
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
2bf0: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
2c00: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
2c10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2c20: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  0;.}../*.** Inse
2c30: 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22  rt code into "v"
2c40: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
2c50: 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68  the record on th
2c60: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20  e top of the.** 
2c70: 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73  stack into the s
2c80: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
2c90: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
2ca0: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
2cb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2cc0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
2cd0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2ce0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20  pOrderBy,    /* 
2cf0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
2d00: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
2d10: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
2d20: 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c  /* The whole SEL
2d30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
2d40: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
2d50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2d60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2d70: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2d80: 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71   pOrderBy);.  sq
2d90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2da0: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70  , OP_Sequence, p
2db0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
2dc0: 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  r, 0);.  sqlite3
2dd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2de0: 50 75 6c 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Pull, pOrderBy->
2df0: 6e 45 78 70 72 20 2b 20 31 2c 20 30 29 3b 0a 20  nExpr + 1, 0);. 
2e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e10: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
2e20: 72 64 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rd, pOrderBy->nE
2e30: 78 70 72 20 2b 20 32 2c 20 30 29 3b 0a 20 20 73  xpr + 2, 0);.  s
2e40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2e50: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
2e60: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
2e70: 73 6f 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  sor, 0);.  if( p
2e80: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3e 3d  Select->iLimit>=
2e90: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  0 ){.    int add
2ea0: 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61  r1, addr2;.    a
2eb0: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
2ec0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
2ed0: 4d 65 6d 5a 65 72 6f 2c 20 70 53 65 6c 65 63 74  MemZero, pSelect
2ee0: 2d 3e 69 4c 69 6d 69 74 2b 31 2c 20 30 29 3b 0a  ->iLimit+1, 0);.
2ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f00: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
2f10: 63 72 2c 20 2d 31 2c 20 70 53 65 6c 65 63 74 2d  cr, -1, pSelect-
2f20: 3e 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20  >iLimit+1);.    
2f30: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
2f40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
2f50: 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oto, 0, 0);.    
2f60: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f70: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
2f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f90: 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  dOp(v, OP_Last, 
2fa0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
2fb0: 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  or, 0);.    sqli
2fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
2fd0: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
2fe0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 30  rBy->iECursor, 0
2ff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3000: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3010: 64 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63  dr2);.    pSelec
3020: 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  t->iLimit = -1;.
3030: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3040: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
3050: 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f  nt the OFFSET.*/
3060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
3070: 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20  eOffset(.  Vdbe 
3080: 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *v,          /* 
3090: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
30a0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
30b0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
30c0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
30d0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
30e0: 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
30f0: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 2f 2a 20  Continue,    /* 
3100: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
3110: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
3120: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  cord */.  int nP
3130: 6f 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  op          /* N
3140: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
3150: 6f 20 70 6f 70 20 73 74 61 63 6b 20 77 68 65 6e  o pop stack when
3160: 20 6a 75 6d 70 69 6e 67 20 2a 2f 0a 29 7b 0a 20   jumping */.){. 
3170: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 3e   if( p->iOffset>
3180: 3d 30 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21  =0 && iContinue!
3190: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
31a0: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
31b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
31c0: 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69  emIncr, -1, p->i
31d0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 61 64 64  Offset);.    add
31e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
31f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
3200: 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  Neg, p->iOffset,
3210: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 50 6f   0);.    if( nPo
3220: 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  p>0 ){.      sql
3230: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3240: 20 4f 50 5f 50 6f 70 2c 20 6e 50 6f 70 2c 20 30   OP_Pop, nPop, 0
3250: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
3260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
3270: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f   OP_Goto, 0, iCo
3280: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62  ntinue);.    Vdb
3290: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
32a0: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
32b0: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
32c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
32d0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
32e0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
32f0: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
3300: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
3310: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
3320: 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  of the.** stack 
3330: 61 72 65 20 64 69 73 74 69 6e 63 74 2e 20 20 69  are distinct.  i
3340: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3350: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3360: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3370: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3380: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3390: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
33a0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
33b0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
33c0: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
33d0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
33e0: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
33f0: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
3400: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3410: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3420: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3430: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3440: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3460: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 56 64  deDistinct(.  Vd
3470: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3480: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
3490: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
34a0: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
34b0: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
34c0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
34d0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
34e0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
34f0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
3500: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
3510: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
3520: 2a 2f 0a 20 20 69 6e 74 20 4e 20 20 20 20 20 20  */.  int N      
3530: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
3540: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 6f 66  op N elements of
3550: 20 74 68 65 20 73 74 61 63 6b 20 6d 75 73 74 20   the stack must 
3560: 62 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 29  be distinct */.)
3570: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  {.  sqlite3VdbeA
3580: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
3590: 65 63 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20  ecord, -N, 0);. 
35a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35b0: 70 28 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74  p(v, OP_Distinct
35c0: 2c 20 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56  , iTab, sqlite3V
35d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
35e0: 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+3);.  sqlite3V
35f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
3600: 6f 70 2c 20 4e 2b 31 2c 20 30 29 3b 0a 20 20 73  op, N+1, 0);.  s
3610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3620: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
3630: 64 64 72 52 65 70 65 61 74 29 3b 0a 20 20 56 64  ddrRepeat);.  Vd
3640: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
3650: 20 73 6b 69 70 20 69 6e 64 69 73 74 69 6e 63 74   skip indistinct
3660: 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 73   records"));.  s
3670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
3680: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
3690: 20 69 54 61 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f   iTab, 0);.}.../
36a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
36b0: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
36c0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73  code for the ins
36d0: 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ide of the inner
36e0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45   loop.** of a SE
36f0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  LECT..**.** If s
3700: 72 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d  rcTab and nColum
3710: 6e 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c  n are both zero,
3720: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
3730: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
3740: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
3750: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
3760: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
3770: 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e  row.  If nColumn
3780: 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20  >0.** then data 
3790: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73  is pulled from s
37a0: 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74  rcTab and pEList
37b0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
37c0: 20 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61   get the.** data
37d0: 74 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63  types for each c
37e0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
37f0: 20 69 6e 74 20 73 65 6c 65 63 74 49 6e 6e 65 72   int selectInner
3800: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
3810: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
3820: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
3830: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
3840: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
3850: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
3860: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
3870: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
3880: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3890: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
38a0: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
38b0: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
38c0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
38e0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
38f0: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
3900: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
3910: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3920: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
3930: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
3940: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
3950: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
3960: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
3970: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
3980: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
3990: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
39a0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
39b0: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
39c0: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
39d0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20  /.  int eDest,  
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
39f0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
3a00: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
3a10: 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20 20 20    int iParm,    
3a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
3a30: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
3a40: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
3a50: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
3a60: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
3a70: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
3a80: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
3a90: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
3aa0: 65 61 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  eak,            
3ab0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
3ac0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
3ad0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
3ae0: 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
3af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 66 66            /* aff
3b00: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 69 66 20  inity string if 
3b10: 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
3b20: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  on */.){.  Vdbe 
3b30: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
3b40: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
3b50: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3b70: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
3b80: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3b90: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30  t */..  if( v==0
3ba0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
3bb0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
3bc0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
3bd0: 72 65 20 77 61 73 20 61 20 4c 49 4d 49 54 20 63  re was a LIMIT c
3be0: 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 53 45 4c  lause on the SEL
3bf0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
3c00: 68 65 6e 20 64 6f 20 74 68 65 20 63 68 65 63 6b  hen do the check
3c10: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
3c20: 74 68 69 73 20 72 6f 77 20 73 68 6f 75 6c 64 20  this row should 
3c30: 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
3c40: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
3c50: 64 69 73 74 69 6e 63 74 3e 3d 30 20 26 26 20 70  distinct>=0 && p
3c60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a  EList->nExpr>0;.
3c70: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
3c80: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
3c90: 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66  t ){.    codeOff
3ca0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
3cb0: 6e 75 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  nue, 0);.  }..  
3cc0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
3cd0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
3ce0: 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d   */.  if( nColum
3cf0: 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  n>0 ){.    for(i
3d00: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
3d10: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3d20: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3d30: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
3d40: 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , i);.    }.  }e
3d50: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  lse{.    nColumn
3d60: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
3d70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
3d80: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
3d90: 61 72 73 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  arse, pEList);. 
3da0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
3db0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
3dc0: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
3dd0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
3de0: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
3df0: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
3e00: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
3e10: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
3e20: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
3e30: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
3e40: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
3e50: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
3e60: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
3e70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
3e80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43  EList->nExpr==nC
3e90: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64  olumn );.    cod
3ea0: 65 44 69 73 74 69 6e 63 74 28 76 2c 20 64 69 73  eDistinct(v, dis
3eb0: 74 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  tinct, iContinue
3ec0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
3ed0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
3ee0: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
3ef0: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
3f00: 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  nue, nColumn);. 
3f10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
3f20: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
3f30: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
3f40: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
3f50: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
3f60: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
3f70: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
3f80: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
3f90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3fa0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
3fb0: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
3fc0: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
3fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3fe0: 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  p(v, OP_MakeReco
3ff0: 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  rd, nColumn, 0);
4000: 0a 20 20 20 20 20 20 69 66 28 20 61 66 66 20 29  .      if( aff )
4010: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4020: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
4030: 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41   -1, aff, P3_STA
4040: 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TIC);.      }.  
4050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4060: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 6e  ddOp(v, OP_IdxIn
4070: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 30 29 3b  sert, iParm, 0);
4080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4090: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
40a0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
40b0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
40c0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
40d0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
40e0: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
40f0: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
4100: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
4110: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
4120: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
4130: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
4140: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
4150: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  cept: {.      in
4160: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64  t addr;.      ad
4170: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
4180: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
4190: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
41a0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
41b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
41c0: 2c 20 2d 31 2c 20 61 66 66 2c 20 50 33 5f 53 54  , -1, aff, P3_ST
41d0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  ATIC);.      sql
41e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
41f0: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50   OP_NotFound, iP
4200: 61 72 6d 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20  arm, addr+3);.  
4210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4220: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74  ddOp(v, OP_Delet
4230: 65 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  e, iParm, 0);.  
4240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4250: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4260: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4270: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4280: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4290: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
42a0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
42b0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
42c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
42d0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
42e0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
42f0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 0);.      if(
4300: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
4310: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
4320: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
4330: 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20  erBy, p);.      
4340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
4350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4360: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
4370: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4390: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
43a0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 0);.        s
43b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
43c0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
43d0: 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  arm, 0);.      }
43e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
43f0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
4400: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4410: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
4420: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
4430: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
4440: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
4450: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
4460: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
4470: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
4480: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
4490: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
44a0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
44b0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
44c0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
44d0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
44e0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
44f0: 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
4500: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4510: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74  dr(v);.      int
4520: 20 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61   addr2;..      a
4530: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4540: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
4550: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4560: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61  P_NotNull, -1, a
4570: 64 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73  ddr1+3);.      s
4580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4590: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
45a0: 3b 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20  ;.      addr2 = 
45b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45c0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
45d0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  0);.      if( pO
45e0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
45f0: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
4600: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
4610: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
4620: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
4630: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
4640: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
4650: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
4660: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4670: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
4680: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
4690: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
46a0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
46b0: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
46c0: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
46d0: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
46e0: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
46f0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4700: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4710: 20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   p);.      }else
4720: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61  {.        char a
4730: 66 66 69 6e 69 74 79 20 3d 20 28 69 50 61 72 6d  ffinity = (iParm
4740: 3e 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20  >>16)&0xFF;.    
4750: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
4760: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
4770: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
4780: 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 69 6e 69  0].pExpr, affini
4790: 74 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ty);.        sql
47a0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
47b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
47c0: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
47d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
47e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
47f0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50  P_IdxInsert, (iP
4800: 61 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c  arm&0x0000FFFF),
4810: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
4820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4830: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
4840: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4850: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
4860: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
4870: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
4880: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
4890: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
48a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
48b0: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
48c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
48d0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
48e0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
48f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4900: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4910: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
4920: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
4930: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
4940: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
4950: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
4960: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4970: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
4980: 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
4990: 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
49a0: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
49b0: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
49c0: 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
49d0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
49e0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
49f0: 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
4a00: 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
4a10: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4a20: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
4a30: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
4a40: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
4a50: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4a60: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4a70: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4a80: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
4a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4ab0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
4ac0: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
4ad0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
4ae0: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
4af0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4b00: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
4b10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4b20: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
4b30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4b40: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
4b50: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
4b60: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
4b70: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
4b80: 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
4b90: 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
4ba0: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
4bb0: 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
4bc0: 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
4bd0: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
4be0: 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
4bf0: 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
4c00: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
4c10: 20 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72     case SRT_Subr
4c20: 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65  outine:.    case
4c30: 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b   SRT_Callback: {
4c40: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
4c50: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rBy ){.        s
4c60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4c70: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
4c80: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  , nColumn, 0);. 
4c90: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4ca0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4cb0: 72 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20  rderBy, p);.    
4cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
4cd0: 74 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e  t==SRT_Subroutin
4ce0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
4cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4d00: 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50   OP_Gosub, 0, iP
4d10: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
4d20: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
4d30: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4d40: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
4d50: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
4d60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d70: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
4d80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
4d90: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
4da0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
4db0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
4dc0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
4dd0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
4de0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
4df0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
4e00: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
4e10: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
4e20: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
4e30: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
4e40: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
4e50: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
4e60: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
4e70: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
4e80: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
4e90: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
4ea0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4eb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
4ec0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
4ed0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4ee0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4ef0: 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29  Pop, nColumn, 0)
4f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
4f20: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
4f30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
4f40: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
4f50: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
4f60: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
4f70: 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
4f80: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
4f90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4fa0: 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e  MemIncr, -1, p->
4fb0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
4fc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4fd0: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
4fe0: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
4ff0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5000: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  0;.}../*.** Give
5010: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
5020: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
5030: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5040: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
5050: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
5060: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
5070: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
5080: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
5090: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
50a0: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
50b0: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
50c0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
50d0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
50e0: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
50f0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
5100: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
5110: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
5120: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
5130: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
5140: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
5150: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
5160: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
5170: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
5180: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5190: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
51a0: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
51b0: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
51c0: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
51d0: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
51e0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
51f0: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
5200: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
5210: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
5220: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
5230: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
5240: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
5250: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
5260: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
5270: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
5280: 2e 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e  .  Add the KeyIn
5290: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
52a0: 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20  the P3 field of 
52b0: 61 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a  an opcode using.
52c0: 2a 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  ** P3_KEYINFO_HA
52d0: 4e 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75  NDOFF is the usu
52e0: 61 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e  al way of dealin
52f0: 67 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a  g with this..*/.
5300: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
5310: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
5320: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
5330: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
5340: 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  st){.  sqlite3 *
5350: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5360: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
5370: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
5380: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
5390: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
53a0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
53b0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
53c0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
53d0: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
53e0: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
53f0: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
5400: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
5410: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
5420: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
5430: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
5440: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
5450: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45  nfo->nField = nE
5460: 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  xpr;.    pInfo->
5470: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
5480: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
5490: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
54a0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
54b0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
54c0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
54d0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
54e0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
54f0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
5500: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
5510: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
5520: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
5530: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
5540: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
5550: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
5560: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
5570: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
5580: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
5590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
55a0: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
55b0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
55c0: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
55d0: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
55e0: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
55f0: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
5600: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
5610: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
5620: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
5630: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
5640: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
5650: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
5660: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
5670: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
5680: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
5690: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
56a0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
56b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
56c0: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
56d0: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
56e0: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
56f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
5700: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
5710: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
5720: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
5730: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 2f 2a  e *v,         /*
5740: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
5750: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
5760: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
5770: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5780: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
5790: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 2c   */.  int eDest,
57a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
57b0: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
57c0: 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ts here */.  int
57d0: 20 69 50 61 72 6d 20 20 20 20 20 20 20 20 2f 2a   iParm        /*
57e0: 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72 61 6d 65   Optional parame
57f0: 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ter associated w
5800: 69 74 68 20 65 44 65 73 74 20 2a 2f 0a 29 7b 0a  ith eDest */.){.
5810: 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c 69    int brk = sqli
5820: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
5830: 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74 20  (v);.  int cont 
5840: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
5850: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74  eLabel(v);.  int
5860: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
5870: 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54  b;.  int pseudoT
5880: 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ab;.  ExprList *
5890: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
58a0: 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61 62 20  rderBy;..  iTab 
58b0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
58c0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
58d0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
58e0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 75  || eDest==SRT_Su
58f0: 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  broutine ){.    
5900: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
5910: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
5920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5930: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
5940: 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29  o, pseudoTab, 0)
5950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5960: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74  eAddOp(v, OP_Set
5970: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 73 65 75  NumColumns, pseu
5980: 64 6f 54 61 62 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  doTab, nColumn);
5990: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20  .  }.  addr = 1 
59a0: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
59b0: 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  Op(v, OP_Sort, i
59c0: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64  Tab, brk);.  cod
59d0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f  eOffset(v, p, co
59e0: 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 65 44  nt, 0);.  if( eD
59f0: 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
5a00: 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  k || eDest==SRT_
5a10: 53 75 62 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  Subroutine ){.  
5a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a30: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
5a40: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 1, 0);.  }.  s
5a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5a60: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
5a70: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
5a80: 78 70 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74  xpr + 1);.  swit
5a90: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
5aa0: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
5ab0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
5ac0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
5ad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5ae0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
5af0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
5b00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5b10: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
5b20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5b30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5b40: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
5b50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5b60: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
5b70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5b80: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
5b90: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5ba0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5bb0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
5bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5bd0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
5be0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5bf0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5c10: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
5c20: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
5c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5c40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
5c50: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5c60: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
5c70: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
5c80: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5c90: 2c 20 31 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f  , 1, 0, "c", P3_
5ca0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
5cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5cc0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5cd0: 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46   (iParm&0x0000FF
5ce0: 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  FF), 0);.      b
5cf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5d00: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5d10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5d20: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d40: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
5d50: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
5d60: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5d70: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
5d80: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
5d90: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
5da0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5db0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
5dc0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
5dd0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
5de0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
5df0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
5e00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5e10: 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61  Insert, pseudoTa
5e20: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  b, 0);.      for
5e30: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
5e40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
5e50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5e60: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
5e70: 65 75 64 6f 54 61 62 2c 20 69 29 3b 0a 20 20 20  eudoTab, i);.   
5e80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
5e90: 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61  Dest==SRT_Callba
5ea0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
5eb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5ec0: 2c 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e  , OP_Callback, n
5ed0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
5ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f00: 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
5f10: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
5f20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5f30: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5f40: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
5f50: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
5f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5f70: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
5f80: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
5f90: 6f 6f 70 20 77 68 65 6e 20 74 68 65 20 4c 49 4d  oop when the LIM
5fa0: 49 54 20 69 73 20 72 65 61 63 68 65 64 0a 20 20  IT is reached.  
5fb0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
5fc0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  it>=0 ){.    sql
5fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5fe0: 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c   OP_MemIncr, -1,
5ff0: 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20   p->iLimit);.   
6000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6010: 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a 65 72  p(v, OP_IfMemZer
6020: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 62 72  o, p->iLimit, br
6030: 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  k);.  }..  /* Th
6040: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
6050: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
6060: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
6070: 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20  bel(v, cont);.  
6080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6090: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
60a0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69  b, addr);.  sqli
60b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
60c0: 62 65 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69  bel(v, brk);.  i
60d0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  f( eDest==SRT_Ca
60e0: 6c 6c 62 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d  llback || eDest=
60f0: 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65 20  =SRT_Subroutine 
6100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6110: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
6120: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
6130: 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a  0);.  }..}../*.*
6140: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6150: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
6160: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
6170: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
6180: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
6190: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
61a0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
61b0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
61c0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
61d0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
61e0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
61f0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
6200: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
6210: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
6220: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
6230: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6240: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
6250: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
6260: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
6270: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
6280: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
6290: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
62a0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
62b0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
62c0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
62d0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
62e0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
62f0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
6300: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
6310: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
6320: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
6330: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6340: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
6350: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
6360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
6370: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
6380: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
6390: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
63a0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
63b0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
63c0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
63d0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
63e0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
63f0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
6400: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
6410: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
6420: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
6430: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
6440: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
6450: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6460: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28  har *columnType(
6470: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
6480: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
6490: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
64a0: 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a  r **pzOriginDb,.
64b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
64c0: 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f  zOriginTab,.  co
64d0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
64e0: 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72  ginCol.){.  char
64f0: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
6500: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
6510: 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a  *zOriginDb = 0;.
6520: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
6530: 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20  riginTab = 0;.  
6540: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
6550: 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e  ginCol = 0;.  in
6560: 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78 70 72  t j;.  if( pExpr
6570: 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63  ==0 || pNC->pSrc
6580: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
6590: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 54 4b   0;..  /* The TK
65a0: 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  _AS operator can
65b0: 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 6e 20 4f   only occur in O
65c0: 52 44 45 52 20 42 59 2c 20 47 52 4f 55 50 20 42  RDER BY, GROUP B
65d0: 59 2c 20 48 41 56 49 4e 47 2c 0a 20 20 2a 2a 20  Y, HAVING,.  ** 
65e0: 61 6e 64 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  and LIMIT clause
65f0: 73 2e 20 20 42 75 74 20 70 45 78 70 72 20 6f 72  s.  But pExpr or
6600: 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20  iginates in the 
6610: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 0a  result set of a.
6620: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 20 20 53 6f    ** SELECT.  So
6630: 20 70 45 78 70 72 20 63 61 6e 20 6e 65 76 65 72   pExpr can never
6640: 20 63 6f 6e 74 61 69 6e 20 61 6e 20 41 53 20 6f   contain an AS o
6650: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
6660: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
6670: 70 21 3d 54 4b 5f 41 53 20 29 3b 0a 0a 20 20 73  p!=TK_AS );..  s
6680: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
6690: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
66a0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
66b0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
66c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
66d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
66e0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
66f0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
6700: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
6710: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
6720: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
6730: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
6740: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
6750: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
6760: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
6770: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
6780: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
6790: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
67a0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
67b0: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
67c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
67d0: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
67e0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
67f0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
6800: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
6810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
6820: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
6830: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
6840: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
6850: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
6860: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
6870: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
6880: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
6890: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
68a0: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
68b0: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
68c0: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
68d0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
68e0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
68f0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
6900: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
6910: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
6920: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
6930: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
6940: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
6950: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
6960: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
6970: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
6980: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
6990: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
69a0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
69b0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
69c0: 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20   /* FIX ME:.    
69d0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
69e0: 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61  occurs if you ha
69f0: 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ve something lik
6a00: 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b  e "SELECT new.x;
6a10: 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20  " inside.       
6a20: 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20   ** a trigger.  
6a30: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
6a40: 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65  if you reference
6a50: 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65   the special "ne
6a60: 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  w".        ** ta
6a70: 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ble in the resul
6a80: 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63  t set of a selec
6a90: 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61  t.  We do not ha
6aa0: 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20  ve a good way.  
6ab0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
6ac0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c   the actual tabl
6ad0: 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20  e type, so call 
6ae0: 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73  it "TEXT".  This
6af0: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20   is really.     
6b00: 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20     ** something 
6b10: 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20  of a bug, but I 
6b20: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
6b30: 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20  to fix it..     
6b40: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
6b50: 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20   This code does 
6b60: 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20  not produce the 
6b70: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d  correct answer -
6b80: 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74   it just prevent
6b90: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
6ba0: 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69  egfault.  See ti
6bb0: 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20  cket #1229..    
6bc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a      */.        z
6bd0: 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20  Type = "TEXT";. 
6be0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6bf0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
6c00: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
6c10: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
6c20: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
6c30: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
6c40: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
6c50: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
6c60: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
6c70: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
6c80: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
6c90: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
6ca0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
6cb0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
6cc0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
6cd0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
6ce0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
6cf0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6d00: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
6d10: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
6d20: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
6d30: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
6d40: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
6d50: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
6d60: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
6d70: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
6d80: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
6d90: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
6da0: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
6db0: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
6dc0: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
6dd0: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
6de0: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
6df0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
6e00: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
6e10: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
6e20: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
6e30: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
6e40: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
6e50: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
6e60: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
6e70: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
6e80: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
6e90: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
6ea0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
6eb0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
6ec0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
6ed0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
6ee0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
6ef0: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
6f00: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
6f10: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
6f20: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
6f30: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
6f40: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
6f50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6f60: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
6f70: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
6f80: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
6f90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6fa0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
6fb0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
6fc0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
6fd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6fe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
6ff0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
7000: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7010: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
7020: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7030: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7040: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7050: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
7060: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
7070: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7080: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7090: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
70a0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
70b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
70c0: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
70d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
70e0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
70f0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
7100: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
7110: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
7120: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
7130: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
7140: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7160: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7170: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7180: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
71a0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
71b0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
71c0: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
71d0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
71e0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
71f0: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
7200: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
7210: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
7220: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7230: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
7240: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
7250: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
7260: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
7270: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
7280: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
7290: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
72a0: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
72b0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
72c0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
72d0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
72e0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
72f0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
7300: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
7310: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
7320: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
7330: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
7340: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
7350: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
7360: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7370: 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  dif.  }.  .  if(
7380: 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20   pzOriginDb ){. 
7390: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
73a0: 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67  ginTab && pzOrig
73b0: 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  inCol );.    *pz
73c0: 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67  OriginDb = zOrig
73d0: 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  inDb;.    *pzOri
73e0: 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e  ginTab = zOrigin
73f0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
7400: 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43  inCol = zOriginC
7410: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ol;.  }.  return
7420: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
7430: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
7440: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
7450: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
7460: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
7470: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
7480: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
7490: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
74a0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
74b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
74c0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
74d0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
74e0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
74f0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
7500: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
7510: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
7520: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
7530: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
7540: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
7550: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
7560: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
7570: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7580: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
7590: 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73   = pTabList;.  s
75a0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
75b0: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  se;.  for(i=0; i
75c0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
75d0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
75e0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
75f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73  .pExpr;.    cons
7600: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
7610: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
7620: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
7630: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
7640: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
7650: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7660: 2a 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54  *zType = columnT
7670: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f  ype(&sNC, p, &zO
7680: 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62  rigDb, &zOrigTab
7690: 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20  , &zOrigCol);.. 
76a0: 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d     /* The vdbe m
76b0: 75 73 74 20 6d 61 6b 65 20 69 74 27 73 20 6f 77  ust make it's ow
76c0: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
76d0: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
76e0: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
76f0: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
7700: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
7710: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
7720: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
7730: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
7740: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
7750: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
7760: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7770: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
7780: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
7790: 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  P3_TRANSIENT);. 
77a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
77b0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
77c0: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
77d0: 20 7a 4f 72 69 67 44 62 2c 20 50 33 5f 54 52 41   zOrigDb, P3_TRA
77e0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
77f0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
7800: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
7810: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
7820: 2c 20 50 33 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P3_TRANSIENT);
7830: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7840: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
7850: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
7860: 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 33 5f 54 52   zOrigCol, P3_TR
7870: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
7880: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7890: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
78a0: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
78b0: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
78c0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
78d0: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
78e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
78f0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
7900: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
7910: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
7920: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
7930: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
7940: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
7950: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
7960: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
7970: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
7980: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
7990: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
79a0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
79b0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
79c0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
79d0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
79e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
79f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
7a00: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
7a10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7a20: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
7a30: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
7a40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7a50: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
7a60: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
7a70: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
7a80: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
7a90: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7aa0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
7ab0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
7ac0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
7ad0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
7ae0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30  NamesSet || v==0
7af0: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
7b00: 63 46 61 69 6c 65 64 28 29 20 29 20 72 65 74 75  cFailed() ) retu
7b10: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
7b20: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
7b30: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
7b40: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
7b50: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
7b60: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
7b70: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
7b80: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
7b90: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
7ba0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
7bb0: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
7bc0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
7bd0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7be0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
7bf0: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
7c00: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
7c10: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
7c20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
7c30: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
7c40: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
7c50: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
7c60: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
7c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
7c80: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
7c90: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
7ca0: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  ame, strlen(zNam
7cb0: 65 29 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e));.      conti
7cc0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
7cd0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
7ce0: 55 4d 4e 20 26 26 20 70 54 61 62 4c 69 73 74 20  UMN && pTabList 
7cf0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
7d00: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
7d10: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
7d20: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
7d30: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
7d40: 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; j<pTabList->
7d50: 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74  nSrc && pTabList
7d60: 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d  ->a[j].iCursor!=
7d70: 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b  p->iTable; j++){
7d80: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
7d90: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
7da0: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
7db0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
7dc0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
7dd0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
7de0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
7df0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
7e00: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
7e10: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
7e20: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
7e30: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
7e40: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
7e50: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
7e60: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
7e70: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7e80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
7e90: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
7ea0: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
7eb0: 65 73 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 20  es && p->span.z 
7ec0: 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20  && p->span.z[0] 
7ed0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7ee0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7ef0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
7f00: 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  AME, (char*)p->s
7f10: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
7f20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7f30: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
7f40: 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20  (!shortNames && 
7f50: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
7f60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
7f70: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
7f80: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
7f90: 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62  ;. .        zTab
7fa0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7fb0: 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ].zAlias;.      
7fc0: 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20    if( fullNames 
7fd0: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61  || zTab==0 ) zTa
7fe0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
7ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8000: 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d 65  SetString(&zName
8010: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
8020: 6c 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  l, (char*)0);.  
8030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8040: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8050: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8060: 7a 4e 61 6d 65 2c 20 50 33 5f 44 59 4e 41 4d 49  zName, P3_DYNAMI
8070: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
8080: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8090: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
80a0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
80b0: 45 2c 20 7a 43 6f 6c 2c 20 73 74 72 6c 65 6e 28  E, zCol, strlen(
80c0: 7a 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 7d 0a  zCol));.      }.
80d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
80e0: 3e 73 70 61 6e 2e 7a 20 26 26 20 70 2d 3e 73 70  >span.z && p->sp
80f0: 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  an.z[0] ){.     
8100: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8110: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8120: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68 61 72  NAME_NAME, (char
8130: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
8140: 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 2f  span.n);.      /
8150: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  * sqlite3VdbeCom
8160: 70 72 65 73 73 53 70 61 63 65 28 76 2c 20 61 64  pressSpace(v, ad
8170: 64 72 29 3b 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  dr); */.    }els
8180: 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4e  e{.      char zN
8190: 61 6d 65 5b 33 30 5d 3b 0a 20 20 20 20 20 20 61  ame[30];.      a
81a0: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
81b0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 54 61 62 4c  _COLUMN || pTabL
81c0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
81d0: 73 70 72 69 6e 74 66 28 7a 4e 61 6d 65 2c 20 22  sprintf(zName, "
81e0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b  column%d", i+1);
81f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8200: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8210: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
8220: 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   zName, 0);.    
8230: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
8240: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
8250: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
8260: 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  List);.}..#ifnde
8270: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
8280: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
8290: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
82a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
82b0: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
82c0: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
82d0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
82e0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
82f0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
8300: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
8310: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
8320: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
8330: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
8340: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8350: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
8360: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
8370: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8380: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
8390: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
83a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
83b0: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
83c0: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
83d0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
83e0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
83f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8400: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
8410: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61   */../*.** Forwa
8420: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
8430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 65  /.static int pre
8440: 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72 73  pSelectStmt(Pars
8450: 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f  e*, Select*);../
8460: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
8470: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
8480: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
8490: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
84a0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
84b0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
84c0: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
84d0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
84e0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
84f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
8500: 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65 6c  r *zTabName, Sel
8510: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
8520: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8530: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70 72  int i, j;.  Expr
8540: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
8550: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
8560: 43 6f 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70  Col;..  while( p
8570: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
8580: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
8590: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 69 66  ct->pPrior;.  if
85a0: 28 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d 74  ( prepSelectStmt
85b0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
85c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
85d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
85e0: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
85f0: 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  e(pParse, pSelec
8600: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  t, 0) ){.    ret
8610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
8620: 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  b = sqliteMalloc
8630: 28 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  ( sizeof(Table) 
8640: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
8650: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
8660: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 6e 52  ;.  }.  pTab->nR
8670: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
8680: 7a 4e 61 6d 65 20 3d 20 7a 54 61 62 4e 61 6d 65  zName = zTabName
8690: 20 3f 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   ? sqliteStrDup(
86a0: 7a 54 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20  zTabName) : 0;. 
86b0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
86c0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61  t->pEList;.  pTa
86d0: 62 2d 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74  b->nCol = pEList
86e0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->nExpr;.  asser
86f0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
8700: 29 3b 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20  );.  pTab->aCol 
8710: 3d 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 4d  = aCol = sqliteM
8720: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 54  alloc( sizeof(pT
8730: 61 62 2d 3e 61 43 6f 6c 5b 30 5d 29 2a 70 54 61  ab->aCol[0])*pTa
8740: 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 66 6f 72  b->nCol );.  for
8750: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
8760: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
8770: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
8780: 20 45 78 70 72 20 2a 70 2c 20 2a 70 52 3b 0a 20   Expr *p, *pR;. 
8790: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a     char *zType;.
87a0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
87b0: 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  .    int nName;.
87c0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
87d0: 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 3b  ll;.    int cnt;
87e0: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
87f0: 20 73 4e 43 3b 0a 20 20 20 20 0a 20 20 20 20 2f   sNC;.    .    /
8800: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
8810: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
8820: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
8830: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
8840: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8850: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
8860: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
8870: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
8880: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
8890: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
88a0: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
88b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
88c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
88d0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
88e0: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
88f0: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
8900: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
8910: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
8920: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
8930: 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Dup(zName);.    
8940: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
8950: 3d 54 4b 5f 44 4f 54 20 0a 20 20 20 20 20 20 20  =TK_DOT .       
8960: 20 20 20 20 20 20 20 26 26 20 28 70 52 3d 70 2d         && (pR=p-
8970: 3e 70 52 69 67 68 74 29 21 3d 30 20 26 26 20 70  >pRight)!=0 && p
8980: 52 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 52  R->token.z && pR
8990: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a  ->token.z[0] ){.
89a0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
89b0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 66 72 6f 6d  umns of the from
89c0: 20 41 2e 42 20 75 73 65 20 42 20 61 73 20 74 68   A.B use B as th
89d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
89e0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
89f0: 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26 70 52  Printf("%T", &pR
8a00: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 65  ->token);.    }e
8a10: 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  lse if( p->span.
8a20: 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30  z && p->span.z[0
8a30: 5d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73  ] ){.      /* Us
8a40: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
8a50: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
8a60: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
8a70: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
8a80: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
8a90: 33 4d 50 72 69 6e 74 66 28 22 25 54 22 2c 20 26  3MPrintf("%T", &
8aa0: 70 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65  p->span);.    }e
8ab0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
8ac0: 20 61 6c 6c 20 65 6c 73 65 20 66 61 69 6c 73 2c   all else fails,
8ad0: 20 6d 61 6b 65 20 75 70 20 61 20 6e 61 6d 65 20   make up a name 
8ae0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
8af0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
8b00: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
8b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8b20: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
8b30: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
8b40: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
8b50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8b60: 46 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  Free(zName);.   
8b70: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
8b80: 54 61 62 6c 65 28 30 2c 20 70 54 61 62 29 3b 0a  Table(0, pTab);.
8b90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
8bb0: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
8bc0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
8bd0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
8be0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
8bf0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
8c00: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
8c10: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
8c20: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
8c30: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
8c40: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
8c50: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
8c60: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
8c70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
8c80: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
8c90: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
8ca0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
8cb0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
8cc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
8cd0: 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 3a 25 64  e3MPrintf("%z:%d
8ce0: 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  ", zName, ++cnt)
8cf0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
8d00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
8d10: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
8d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8d30: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8d40: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  zName;..    /* G
8d50: 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65 2c  et the typename,
8d60: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c 20   type affinity, 
8d70: 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
8d80: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a 20  quence for the. 
8d90: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20     ** column..  
8da0: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
8db0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
8dc0: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
8dd0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
8de0: 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54 79  t->pSrc;.    zTy
8df0: 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  pe = sqliteStrDu
8e00: 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  p(columnType(&sN
8e10: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
8e20: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
8e30: 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70 43   = zType;.    pC
8e40: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
8e50: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
8e60: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ty(p);.    pColl
8e70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
8e80: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
8e90: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
8ea0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
8eb0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74 72  Coll = sqliteStr
8ec0: 44 75 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Dup(pColl->zName
8ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
8ee0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
8ef0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
8f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
8f10: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
8f20: 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ent for processi
8f30: 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65 20  ng by doing the 
8f40: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 69  following.** thi
8f50: 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ngs:.**.**    (1
8f60: 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
8f70: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
8f80: 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
8f90: 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
8fa0: 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
8fb0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
8fc0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
8fd0: 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
8fe0: 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
8ff0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
9000: 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
9010: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
9020: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
9030: 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
9040: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
9050: 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
9060: 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
9070: 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
9080: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
9090: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
90a0: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
90b0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
90c0: 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
90d0: 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
90e0: 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
90f0: 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
9100: 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
9110: 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
9120: 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
9130: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
9140: 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
9150: 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
9160: 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72  the presistent r
9170: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
9180: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
9190: 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
91a0: 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
91b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
91c0: 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  e to accomodate 
91d0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
91e0: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ord.**         o
91f0: 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20  n joins and the 
9200: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
9210: 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a  use of joins..**
9220: 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e  .**    (4)  Scan
9230: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c   the list of col
9240: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
9250: 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20  lt set (pEList) 
9260: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  looking.**      
9270: 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73     for instances
9280: 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72   of the "*" oper
9290: 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c  ator or the TABL
92a0: 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  E.* operator..**
92b0: 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e           If foun
92c0: 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22  d, expand each "
92d0: 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  *" to be every c
92e0: 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74  olumn in every t
92f0: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
9300: 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62  and TABLE.* to b
9310: 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
9320: 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 52  n TABLE..**.** R
9330: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
9340: 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  ss.  If there ar
9350: 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61 76  e problems, leav
9360: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
9370: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
9380: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
9390: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
93a0: 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74 6d  nt prepSelectStm
93b0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
93c0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
93d0: 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b 0a  nt i, j, k, rc;.
93e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
93f0: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
9400: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
9410: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
9420: 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70 3d  pFrom;..  if( p=
9430: 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d 30  =0 || p->pSrc==0
9440: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f   || sqlite3Mallo
9450: 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20  cFailed() ){.   
9460: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
9470: 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
9480: 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
9490: 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
94a0: 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
94b0: 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
94c0: 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
94d0: 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
94e0: 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
94f0: 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
9500: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
9510: 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
9520: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
9530: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29  pParse, p->pSrc)
9540: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
9550: 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
9560: 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
9570: 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
9580: 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
9590: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
95a0: 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
95b0: 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
95c0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
95d0: 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
95e0: 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
95f0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
9600: 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
9610: 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
9620: 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
9630: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
9640: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
9650: 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
9660: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
9670: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
9680: 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
9690: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
96a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
96b0: 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
96c0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
96d0: 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
96e0: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
96f0: 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
9700: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
9710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72     }.    if( pFr
9720: 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
9730: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9740: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
9750: 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
9760: 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
9770: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
9780: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
9790: 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
97a0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
97b0: 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d   pFrom->zAlias==
97c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 72  0 ){.        pFr
97d0: 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20 20  om->zAlias =.   
97e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
97f0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73 75  rintf("sqlite_su
9800: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
9810: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
9820: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
9830: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
9840: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
9850: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
9860: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
9870: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
9880: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
9890: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
98a0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
98b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
98c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
98d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
98e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
98f0: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
9900: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
9910: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
9920: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
9930: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
9940: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
9950: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
9960: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
9970: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
9980: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
9990: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
99a0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
99b0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
99c0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
99d0: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
99e0: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
99f0: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
9a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a10: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
9a20: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
9a30: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
9a40: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
9a50: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
9a60: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
9a70: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
9a80: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
9a90: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
9aa0: 70 50 61 72 73 65 2c 70 46 72 6f 6d 2d 3e 7a 4e  pParse,pFrom->zN
9ab0: 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
9ac0: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
9ad0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
9ae0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
9b00: 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64  ->nRef++;.#if !d
9b10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9b20: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
9b30: 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
9b40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
9b50: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
9b60: 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72  pSelect || IsVir
9b70: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
9b80: 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63        /* We reac
9b90: 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61  h here if the na
9ba0: 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72  med table is a r
9bb0: 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a  eally a view */.
9bc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9bd0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
9be0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
9bf0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
9c00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9c10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
9c20: 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  If pFrom->pSelec
9c30: 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65  t!=0 it means we
9c40: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
9c50: 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  h a.        ** v
9c60: 69 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65  iew within a vie
9c70: 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  w.  The SELECT s
9c80: 74 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72  tructure has alr
9c90: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20  eady been.      
9ca0: 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74    ** copied by t
9cb0: 68 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f  he outer view so
9cc0: 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65   we can skip the
9cd0: 20 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a   copy step here.
9ce0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
9cf0: 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20  e inner view..  
9d00: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9d10: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c   if( pFrom->pSel
9d20: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
9d30: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
9d40: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
9d50: 63 74 44 75 70 28 70 54 61 62 2d 3e 70 53 65 6c  ctDup(pTab->pSel
9d60: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
9d70: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
9d80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
9d90: 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
9da0: 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
9db0: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
9dc0: 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
9dd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 50 72 6f  .  if( sqlitePro
9de0: 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
9df0: 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   p) ) return 1;.
9e00: 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
9e10: 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
9e20: 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
9e30: 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
9e40: 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
9e50: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
9e60: 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
9e70: 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
9e80: 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
9e90: 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
9ea0: 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
9eb0: 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
9ec0: 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
9ed0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
9ee0: 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
9ef0: 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
9f00: 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
9f10: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
9f20: 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
9f30: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
9f40: 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
9f50: 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
9f60: 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
9f70: 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
9f80: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
9f90: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
9fa0: 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
9fb0: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
9fc0: 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
9fd0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
9fe0: 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
9ff0: 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
a000: 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
a010: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
a020: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
a030: 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
a040: 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
a050: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
a060: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
a070: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
a080: 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
a090: 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26 26  && pE->pRight &&
a0a0: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
a0b0: 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20  =TK_ALL.        
a0c0: 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26 26   && pE->pLeft &&
a0d0: 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
a0e0: 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a 20  TK_ID ) break;. 
a0f0: 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20 69   }.  rc = 0;.  i
a100: 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
a110: 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
a120: 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
a130: 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
a140: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
a150: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
a160: 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
a170: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
a180: 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
a190: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
a1a0: 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
a1b0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
a1c0: 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
a1d0: 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
a1e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
a1f0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a200: 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
a210: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
a220: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
a230: 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
a240: 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
a250: 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
a260: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
a270: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
a280: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
a290: 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
a2a0: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
a2b0: 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
a2c0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
a2d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
a2e0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
a2f0: 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
a300: 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
a310: 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
a320: 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
a330: 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
a340: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
a350: 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
a360: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
a370: 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
a380: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
a390: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
a3a0: 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
a3b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
a3c0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
a3d0: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
a3e0: 61 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[k].pExpr, 0);.
a3f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
a400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
a410: 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
a420: 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
a430: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
a440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a450: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
a460: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
a470: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
a480: 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
a490: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
a4a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
a4b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a4c0: 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
a4d0: 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
a4e0: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
a4f0: 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
a500: 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
a510: 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
a520: 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
a530: 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
a540: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
a550: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
a560: 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f  * text of name o
a570: 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20  f TABLE */.     
a580: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
a590: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65  K_DOT && pE->pLe
a5a0: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
a5b0: 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  zTName = sqlite3
a5c0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
a5d0: 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29  E->pLeft->token)
a5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a5f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
a600: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
a610: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
a620: 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
a630: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
a640: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
a650: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
a660: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
a670: 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
a680: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
a690: 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
a6a0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ias;.          i
a6b0: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
a6c0: 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30  | zTabName[0]==0
a6d0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
a6e0: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
a6f0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
a700: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
a710: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 28 7a 54  f( zTName && (zT
a720: 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
a730: 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 7c 7c 20 0a  bName[0]==0 || .
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a760: 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
a770: 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )!=0) ){.       
a780: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a7a0: 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
a7b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   1;.          fo
a7c0: 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
a7d0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
a7e0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
a7f0: 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20  pr, *pRight;.   
a800: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
a810: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
a820: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20  l[j].zName;..   
a830: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
a840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a850: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a860: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
a870: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
a880: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a890: 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
a8a0: 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
a8b0: 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
a8e0: 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
a8f0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
a900: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
a910: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
a920: 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
a930: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
a950: 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
a960: 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
a970: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a990: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
a9a0: 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
a9b0: 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
a9c0: 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
a9d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
a9e0: 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
a9f0: 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
aa00: 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
aa10: 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
aa20: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
aa30: 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
aa40: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
aa50: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
aa60: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
aa70: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
aa80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
aa90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
aaa0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
aab0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
aac0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
aad0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
aae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
aaf0: 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 52      setToken(&pR
ab00: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e 61  ight->token, zNa
ab10: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
ab20: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 20 26 26   if( zTabName &&
ab30: 20 28 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70   (longNames || p
ab40: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
ab50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ab60: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
ab70: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
ab80: 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
ab90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
aba0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
abb0: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
abc0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
abd0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
abe0: 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 54              setT
ac00: 6f 6b 65 6e 28 26 70 4c 65 66 74 2d 3e 74 6f 6b  oken(&pLeft->tok
ac10: 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20  en, zTabName);. 
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
ac30: 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d 3e 73 70  Token(&pExpr->sp
ac40: 61 6e 2c 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  an, sqlite3MPrin
ac50: 74 66 28 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  tf("%s.%s", zTab
ac60: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
ac80: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
ac90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
aca0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
acb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
acc0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
acd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ace0: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
acf0: 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
ad00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ad10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
ad20: 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
ad30: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
ad40: 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
ad50: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
ad60: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
ad70: 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
ad90: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
ada0: 4c 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c  ListAppend(pNew,
adb0: 20 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e   pExpr, &pExpr->
adc0: 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  span);.         
add0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ade0: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
adf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ae00: 70 65 6e 64 28 70 4e 65 77 2c 20 70 45 78 70 72  pend(pNew, pExpr
ae10: 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
ae20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
ae30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ae40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
ae50: 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
ae60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
ae70: 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
ae80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ae90: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
aea0: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
aeb0: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
aec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
aee0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
aef0: 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
af00: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
af10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
af20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
af30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
af40: 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ee(zTName);.    
af50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
af60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
af70: 65 74 65 28 70 45 4c 69 73 74 29 3b 0a 20 20 20  ete(pEList);.   
af80: 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
af90: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
afa0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
afb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
afc0: 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
afd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   This routine as
afe0: 73 6f 63 69 61 74 65 73 20 65 6e 74 72 69 65 73  sociates entries
aff0: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
b000: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
b010: 77 69 74 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20  with.** columns 
b020: 69 6e 20 61 20 72 65 73 75 6c 74 2e 20 20 46 6f  in a result.  Fo
b030: 72 20 65 61 63 68 20 4f 52 44 45 52 20 42 59 20  r each ORDER BY 
b040: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
b050: 6f 70 63 6f 64 65 20 6f 66 0a 2a 2a 20 74 68 65  opcode of.** the
b060: 20 74 6f 70 2d 6c 65 76 65 6c 20 6e 6f 64 65 20   top-level node 
b070: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
b080: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20  _COLUMN and the 
b090: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 6f 66  iColumn value of
b0a0: 0a 2a 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  .** the top-leve
b0b0: 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64  l node is filled
b0c0: 20 69 6e 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20   in with column 
b0d0: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69  number and the i
b0e0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  Table.** value o
b0f0: 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
b100: 6e 6f 64 65 20 69 73 20 66 69 6c 6c 65 64 20 77  node is filled w
b110: 69 74 68 20 69 54 61 62 6c 65 20 70 61 72 61 6d  ith iTable param
b120: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eter..**.** If t
b130: 68 65 72 65 20 61 72 65 20 70 72 69 6f 72 20 53  here are prior S
b140: 45 4c 45 43 54 20 63 6c 61 75 73 65 73 2c 20 74  ELECT clauses, t
b150: 68 65 79 20 61 72 65 20 70 72 6f 63 65 73 73 65  hey are processe
b160: 64 20 66 69 72 73 74 2e 20 20 41 20 6d 61 74 63  d first.  A matc
b170: 68 0a 2a 2a 20 69 6e 20 61 6e 20 65 61 72 6c 69  h.** in an earli
b180: 65 72 20 53 45 4c 45 43 54 20 74 61 6b 65 73 20  er SELECT takes 
b190: 70 72 65 63 65 64 65 6e 63 65 20 6f 76 65 72 20  precedence over 
b1a0: 61 20 6c 61 74 65 72 20 53 45 4c 45 43 54 2e 0a  a later SELECT..
b1b0: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 6e 74 72 79 20  **.** Any entry 
b1c0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
b1d0: 74 63 68 20 69 73 20 66 6c 61 67 67 65 64 20 61  tch is flagged a
b1e0: 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
b1f0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
b200: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
b210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b220: 6d 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f  matchOrderbyToCo
b230: 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  lumn(.  Parse *p
b240: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
b250: 2f 2a 20 41 20 70 6c 61 63 65 20 74 6f 20 6c 65  /* A place to le
b260: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
b270: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
b280: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 20  pSelect,        
b290: 2f 2a 20 4d 61 74 63 68 20 74 6f 20 72 65 73 75  /* Match to resu
b2a0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  lt columns of th
b2b0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 45  is SELECT */.  E
b2c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
b2d0: 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  y,     /* The OR
b2e0: 44 45 52 20 42 59 20 76 61 6c 75 65 73 20 74 6f  DER BY values to
b2f0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 63   match against c
b300: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
b310: 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
b320: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
b330: 69 73 20 76 61 6c 75 65 20 69 6e 20 69 54 61 62  is value in iTab
b340: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74  le */.  int must
b350: 43 6f 6d 70 6c 65 74 65 20 20 20 20 20 20 20 20  Complete        
b360: 2f 2a 20 49 66 20 54 52 55 45 20 61 6c 6c 20 4f  /* If TRUE all O
b370: 52 44 45 52 20 42 59 73 20 6d 75 73 74 20 6d 61  RDER BYs must ma
b380: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
b390: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nErr = 0;.  int 
b3a0: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
b3b0: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
b3c0: 20 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70   pSelect==0 || p
b3d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
b3e0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 6d 75 73  urn 1;.  if( mus
b3f0: 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20  tComplete ){.   
b400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
b410: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
b420: 29 7b 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  ){ pOrderBy->a[i
b430: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 20 7d 0a 20 20  ].done = 0; }.  
b440: 7d 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  }.  if( prepSele
b450: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
b460: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
b470: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
b480: 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  f( pSelect->pPri
b490: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61  or ){.    if( ma
b4a0: 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75  tchOrderbyToColu
b4b0: 6d 6e 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  mn(pParse, pSele
b4c0: 63 74 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 72 64  ct->pPrior, pOrd
b4d0: 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 30 29  erBy, iTable, 0)
b4e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b4f0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
b500: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
b510: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28  ->pEList;.  for(
b520: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
b530: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b540: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 4f 72    Expr *pE = pOr
b550: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
b560: 72 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  r;.    int iCol 
b570: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4f  = -1;.    if( pO
b580: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
b590: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
b5a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
b5b0: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
b5c0: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  iCol) ){.      i
b5d0: 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43  f( iCol<=0 || iC
b5e0: 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  ol>pEList->nExpr
b5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b600: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b610: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4f  se,.          "O
b620: 52 44 45 52 20 42 59 20 70 6f 73 69 74 69 6f 6e  RDER BY position
b630: 20 25 64 20 73 68 6f 75 6c 64 20 62 65 20 62 65   %d should be be
b640: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
b650: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 2c  .          iCol,
b660: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
b670: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
b680: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
b690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b6a0: 28 20 21 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20  ( !mustComplete 
b6b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b6c0: 20 20 69 43 6f 6c 2d 2d 3b 0a 20 20 20 20 7d 0a    iCol--;.    }.
b6d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 43 6f      for(j=0; iCo
b6e0: 6c 3c 30 20 26 26 20 6a 3c 70 45 4c 69 73 74 2d  l<0 && j<pEList-
b6f0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
b700: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
b710: 61 5b 6a 5d 2e 7a 4e 61 6d 65 20 26 26 20 28 70  a[j].zName && (p
b720: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20  E->op==TK_ID || 
b730: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  pE->op==TK_STRIN
b740: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  G) ){.        ch
b750: 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a 7a 4c 61 62  ar *zName, *zLab
b760: 65 6c 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  el;.        zNam
b770: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  e = pEList->a[j]
b780: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
b790: 7a 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  zLabel = sqlite3
b7a0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 26 70  NameFromToken(&p
b7b0: 45 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  E->token);.     
b7c0: 20 20 20 61 73 73 65 72 74 28 20 7a 4c 61 62 65     assert( zLabe
b7d0: 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
b7e0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
b7f0: 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  mp(zName, zLabel
b800: 29 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20  )==0 ){ .       
b810: 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20 20 20     iCol = j;.   
b820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
b830: 71 6c 69 74 65 46 72 65 65 28 7a 4c 61 62 65 6c  qliteFree(zLabel
b840: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b850: 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20 73   if( iCol<0 && s
b860: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
b870: 65 28 70 45 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e(pE, pEList->a[
b880: 6a 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  j].pExpr) ){.   
b890: 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a 3b 0a 20       iCol = j;. 
b8a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b8b0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
b8c0: 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20 54        pE->op = T
b8d0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
b8e0: 70 45 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43  pE->iColumn = iC
b8f0: 6f 6c 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 54  ol;.      pE->iT
b900: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
b910: 20 20 20 20 20 70 45 2d 3e 69 41 67 67 20 3d 20       pE->iAgg = 
b920: 2d 31 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72  -1;.      pOrder
b930: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
b940: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
b950: 20 69 43 6f 6c 3c 30 20 26 26 20 6d 75 73 74 43   iCol<0 && mustC
b960: 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  omplete ){.     
b970: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b980: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b990: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
b9a0: 6e 75 6d 62 65 72 20 25 64 20 64 6f 65 73 20 6e  number %d does n
b9b0: 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 72 65 73  ot match any res
b9c0: 75 6c 74 20 63 6f 6c 75 6d 6e 22 2c 20 69 2b 31  ult column", i+1
b9d0: 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  );.      nErr++;
b9e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b9f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ba00: 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
ba10: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
ba20: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
ba30: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
ba40: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
ba50: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
ba60: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
ba70: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
ba80: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
ba90: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
baa0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
bab0: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
bac0: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
bad0: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
bae0: 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
baf0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
bb00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
bb10: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
bb20: 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70     v = pParse->p
bb30: 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Vdbe = sqlite3Vd
bb40: 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65 2d  beCreate(pParse-
bb50: 3e 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >db);.  }.  retu
bb60: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
bb70: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
bb80: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
bb90: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
bba0: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
bbb0: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
bbc0: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
bbd0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
bbe0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
bbf0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
bc00: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
bc10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
bc20: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
bc30: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
bc40: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
bc50: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
bc60: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
bc70: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
bc80: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
bc90: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
bca0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
bcb0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
bcc0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
bcd0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
bce0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
bcf0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
bd00: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
bd10: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
bd20: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
bd30: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
bd40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bd50: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
bd60: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
bd70: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
bd80: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
bd90: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
bda0: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
bdb0: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
bdc0: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
bdd0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
bde0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
bdf0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
be00: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
be10: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
be20: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
be30: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
be40: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
be50: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
be60: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
be70: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
be80: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
be90: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
bea0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
beb0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
bec0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
bed0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
bee0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
bef0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
bf00: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
bf10: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
bf20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
bf30: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
bf40: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
bf50: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
bf60: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
bf70: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
bf80: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
bf90: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
bfa0: 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 0a   addr1, addr2;..
bfb0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
bfc0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
bfd0: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
bfe0: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
bff0: 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f   contraversy abo
c000: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
c010: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
c020: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
c030: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
c040: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
c050: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
c060: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
c070: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
c080: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
c090: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
c0a0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
c0b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
c0c0: 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 76 20 3d  em += 2;.    v =
c0d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c0e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
c0f0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
c100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c110: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
c120: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
c130: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c140: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30 2c  OP_MustBeInt, 0,
c150: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c160: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c170: 4d 65 6d 53 74 6f 72 65 2c 20 69 4c 69 6d 69 74  MemStore, iLimit
c180: 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
c190: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d  mment((v, "# LIM
c1a0: 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
c1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c1c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 5a  dOp(v, OP_IfMemZ
c1d0: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
c1e0: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eak);.  }.  if( 
c1f0: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
c200: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
c210: 4f 66 66 73 65 74 20 3d 20 70 50 61 72 73 65 2d  Offset = pParse-
c220: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 76 20 3d  >nMem++;.    v =
c230: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c240: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
c250: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
c260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c270: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
c280: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
c290: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c2a0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 30   OP_MustBeInt, 0
c2b0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c2c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c2d0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4f 66 66 73  _MemStore, iOffs
c2e0: 65 74 2c 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  et, p->pLimit==0
c2f0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
c300: 6e 74 28 28 76 2c 20 22 23 20 4f 46 46 53 45 54  nt((v, "# OFFSET
c310: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
c320: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
c330: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c340: 49 66 4d 65 6d 50 6f 73 2c 20 69 4f 66 66 73 65  IfMemPos, iOffse
c350: 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 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 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
c380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c390: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
c3a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c3b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c3c0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
c3d0: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
c3e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c3f0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
c400: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  d, 0, 0);.    }.
c410: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
c420: 6d 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 31  mit ){.    addr1
c430: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c440: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50  dOp(v, OP_IfMemP
c450: 6f 73 2c 20 69 4c 69 6d 69 74 2c 20 30 29 3b 0a  os, iLimit, 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 50 6f 70 2c 20  ddOp(v, OP_Pop, 
c480: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
c490: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c4a0: 50 5f 4d 65 6d 49 6e 74 2c 20 2d 31 2c 20 69 4c  P_MemInt, -1, iL
c4b0: 69 6d 69 74 2b 31 29 3b 0a 20 20 20 20 61 64 64  imit+1);.    add
c4c0: 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
c4d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
c4e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c4f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c500: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
c510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c520: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
c530: 20 69 4c 69 6d 69 74 2b 31 2c 20 31 29 3b 0a 20   iLimit+1, 1);. 
c540: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c550: 76 2c 20 22 23 20 4c 49 4d 49 54 2b 4f 46 46 53  v, "# LIMIT+OFFS
c560: 45 54 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ET"));.    sqlit
c570: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c580: 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a 7d 0a  , addr2);.  }.}.
c590: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
c5a0: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
c5b0: 74 6f 20 75 73 65 20 66 6f 72 20 73 6f 72 74 69  to use for sorti
c5c0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
c5d0: 69 64 20 63 72 65 61 74 65 53 6f 72 74 69 6e 67  id createSorting
c5e0: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
c5f0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
c600: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
c610: 42 79 29 7b 0a 20 20 69 66 28 20 70 4f 72 64 65  By){.  if( pOrde
c620: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  rBy ){.    int a
c630: 64 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ddr;.    assert(
c640: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
c650: 73 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4f  sor==0 );.    pO
c660: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
c670: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
c680: 2b 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  +;.    addr = sq
c690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70  lite3VdbeAddOp(p
c6a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
c6b0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
c6e0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
c6f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
c700: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
c710: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
c720: 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  2] == -1 );.    
c730: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
c740: 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20 7d 0a 7d  2] = addr;.  }.}
c750: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c760: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
c770: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
c780: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
c790: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
c7a0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
c7b0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
c7c0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
c7d0: 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
c7e0: 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
c7f0: 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
c800: 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
c810: 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
c820: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
c830: 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
c840: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
c850: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
c860: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
c870: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
c880: 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
c890: 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
c8a0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
c8b0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
c8c0: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
c8d0: 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
c8e0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
c8f0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
c900: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
c910: 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
c920: 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
c930: 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
c940: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
c950: 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
c960: 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
c970: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
c980: 7d 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20  }.  if( pRet==0 
c990: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
c9a0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c9b0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
c9c0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
c9d0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
c9e0: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
c9f0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
ca00: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
ca10: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
ca20: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
ca30: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
ca40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ca50: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
ca60: 20 71 75 65 72 79 20 74 68 61 74 20 69 73 20 72   query that is r
ca70: 65 61 6c 6c 79 20 74 68 65 20 75 6e 69 6f 6e 0a  eally the union.
ca80: 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65 63 74 69  ** or intersecti
ca90: 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  on of two or mor
caa0: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
cab0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  es..**.** "p" po
cac0: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
cad0: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
cae0: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
caf0: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
cb00: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
cb10: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
cb20: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
cb30: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
cb40: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
cb50: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
cb60: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
cb70: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
cb80: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
cb90: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
cba0: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
cbb0: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
cbc0: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
cbd0: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
cbe0: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
cbf0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
cc00: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
cc10: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
cc20: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
cc30: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
cc40: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
cc50: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
cc60: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
cc70: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
cc80: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
cc90: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
cca0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
ccb0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
ccc0: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
ccd0: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
cce0: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
cd00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
cd10: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
cd20: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
cd30: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
cd40: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
cd50: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
cd60: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
cd70: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
cd80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
cd90: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
cda0: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
cdb0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
cdc0: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
cdd0: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
cde0: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
cdf0: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
ce00: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
ce10: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
ce20: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
ce30: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
ce40: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
ce50: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
ce60: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
ce70: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
ce80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
ce90: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
cea0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ceb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
cec0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
ced0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
cee0: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
cef0: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
cf00: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69   be coded */.  i
cf10: 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20 20  nt eDest,       
cf20: 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20 20 53 74       /* \___  St
cf30: 6f 72 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  ore query result
cf40: 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20 2a  s as specified *
cf50: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 2c 20 20  /.  int iParm,  
cf60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2f 20 20            /* /  
cf70: 20 20 20 62 79 20 74 68 65 73 65 20 74 77 6f 20     by these two 
cf80: 70 61 72 61 6d 65 74 65 72 73 2e 20 20 20 20 20  parameters.     
cf90: 20 20 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61      */.  char *a
cfa0: 66 66 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ff             /
cfb0: 2a 20 49 66 20 65 44 65 73 74 20 69 73 20 53 52  * If eDest is SR
cfc0: 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20 61 66 66  T_Union, the aff
cfd0: 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  inity string */.
cfe0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
cff0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
d000: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
d010: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
d020: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
d030: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
d040: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
d050: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
d060: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d080: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d090: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
d0a0: 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
d0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d0c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
d0d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
d0e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
d0f0: 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f  erBy;   /* The O
d100: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
d110: 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 61 53 65  n p */.  int aSe
d120: 74 50 32 5b 32 5d 3b 20 20 20 20 20 20 20 20 2f  tP2[2];        /
d130: 2a 20 53 65 74 20 50 32 20 76 61 6c 75 65 20 6f  * Set P2 value o
d140: 66 20 74 68 65 73 65 20 6f 70 20 74 6f 20 6e 75  f these op to nu
d150: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
d160: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74 50 32 20  */.  int nSetP2 
d170: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
d180: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 69 6e  mber of slots in
d190: 20 61 53 65 74 50 32 5b 5d 20 75 73 65 64 20 2a   aSetP2[] used *
d1a0: 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  /..  /* Make sur
d1b0: 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
d1c0: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
d1d0: 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
d1e0: 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
d1f0: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
d200: 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
d210: 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
d220: 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
d230: 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
d240: 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  */.  if( p==0 ||
d250: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
d260: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
d270: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d280: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 50  ct_end;.  }.  pP
d290: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
d2a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
d2b0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d  or->pRightmost!=
d2c0: 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65  pPrior );.  asse
d2d0: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
d2e0: 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68  htmost==p->pRigh
d2f0: 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66 28 20 70  tmost );.  if( p
d300: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
d310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d320: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
d330: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
d340: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
d350: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
d360: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
d370: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
d380: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d390: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d3a0: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
d3b0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
d3c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d3d0: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
d3e0: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
d3f0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
d400: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
d410: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
d420: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
d430: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d440: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d450: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
d460: 65 20 77 65 20 68 61 76 65 20 61 20 76 61 6c 69  e we have a vali
d470: 64 20 71 75 65 72 79 20 65 6e 67 69 6e 65 2e 20  d query engine. 
d480: 20 49 66 20 6e 6f 74 2c 20 63 72 65 61 74 65 20   If not, create 
d490: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
d4a0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
d4b0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d4c0: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
d4d0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
d4e0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d4f0: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65  d;.  }..  /* Cre
d500: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
d510: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
d520: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
d530: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73  .  */.  if( eDes
d540: 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
d550: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d560: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
d570: 61 73 73 65 72 74 28 20 6e 53 65 74 50 32 3c 73  assert( nSetP2<s
d580: 69 7a 65 6f 66 28 61 53 65 74 50 32 29 2f 73 69  izeof(aSetP2)/si
d590: 7a 65 6f 66 28 61 53 65 74 50 32 5b 30 5d 29 20  zeof(aSetP2[0]) 
d5a0: 29 3b 0a 20 20 20 20 61 53 65 74 50 32 5b 6e 53  );.    aSetP2[nS
d5b0: 65 74 50 32 2b 2b 5d 20 3d 20 73 71 6c 69 74 65  etP2++] = sqlite
d5c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d5d0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
d5e0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 65  iParm, 0);.    e
d5f0: 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
d600: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
d610: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
d620: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
d630: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d640: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 64 65  ts..  */.  pOrde
d650: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
d660: 79 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  y;.  switch( p->
d670: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
d680: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
d690: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
d6a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
d6b0: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
d6c0: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
d6d0: 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20  >pLimit );.     
d6e0: 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
d6f0: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
d700: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70         pPrior->p
d710: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
d720: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  set;.        rc 
d730: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d740: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
d750: 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 30 2c  eDest, iParm, 0,
d760: 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20 20   0, 0, aff);.   
d770: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
d780: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   0;.        p->p
d790: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
d7a0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
d7b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d7c0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d7d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d7e0: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
d7f0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
d800: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
d810: 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  it;.        p->i
d820: 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
d830: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
d840: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e    if( p->iLimit>
d850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d860: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d870: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
d880: 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  MemZero, p->iLim
d890: 69 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  it, 0);.        
d8a0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
d8b0: 2c 20 22 23 20 4a 75 6d 70 20 61 68 65 61 64 20  , "# Jump ahead 
d8c0: 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
d8d0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  "));.        }. 
d8e0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d8f0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
d900: 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61 72  , p, eDest, iPar
d910: 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  m, 0, 0, 0, aff)
d920: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72  ;.        p->pPr
d930: 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
d940: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d950: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
d960: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d980: 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20     if( addr ){. 
d990: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d9a0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d9b0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  addr);.        }
d9c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d9d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
d9e0: 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c 4c 20 2e   For UNION ALL .
d9f0: 2e 2e 20 4f 52 44 45 52 20 42 59 20 66 61 6c 6c  .. ORDER BY fall
da00: 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
da10: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
da20: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
da30: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
da40: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
da50: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
da60: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
da70: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
da80: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
da90: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
daa0: 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20     int op = 0;  
dab0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
dac0: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
dad0: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
dae0: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
daf0: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
db00: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
db10: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
db20: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
db30: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
db40: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
db50: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
db60: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
db70: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
db80: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20     int addr;..  
db90: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 70 2d      priorOp = p-
dba0: 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f 20 53 52  >op==TK_ALL ? SR
dbb0: 54 5f 54 61 62 6c 65 20 3a 20 53 52 54 5f 55 6e  T_Table : SRT_Un
dbc0: 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 65  ion;.      if( e
dbd0: 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
dbe0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
dbf0: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70  !p->pLimit && !p
dc00: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
dc10: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
dc20: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
dc30: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
dc40: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
dc50: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
dc60: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
dc70: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
dc80: 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20 20 20 20  b = iParm;.     
dc90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dca0: 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
dcb0: 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
dcc0: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
dcd0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
dce0: 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
dcf0: 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
dd00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dd10: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61    unionTab = pPa
dd20: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
dd30: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
dd40: 79 20 26 26 20 6d 61 74 63 68 4f 72 64 65 72 62  y && matchOrderb
dd50: 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  yToColumn(pParse
dd60: 2c 20 70 2c 20 70 4f 72 64 65 72 42 79 2c 20 75  , p, pOrderBy, u
dd70: 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b 0a 20 20  nionTab,1) ){.  
dd80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
dd90: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
dda0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ddb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ddc0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
ddd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
dde0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
ddf0: 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
de00: 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72 4f        if( priorO
de10: 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a  p==SRT_Table ){.
de20: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
de30: 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66 28  ( nSetP2<sizeof(
de40: 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28 61  aSetP2)/sizeof(a
de50: 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20 20  SetP2[0]) );.   
de60: 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e 53         aSetP2[nS
de70: 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b 0a  etP2++] = addr;.
de80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
de90: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
dea0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
deb0: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
dec0: 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
ded0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
dee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
def0: 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73 45  Rightmost->usesE
df00: 70 68 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  phm = 1;.       
df10: 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61 74   }.        creat
df20: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  eSortingIndex(pP
df30: 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42  arse, p, pOrderB
df40: 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  y);.        asse
df50: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
df60: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
df70: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
df80: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
df90: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
dfa0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
dfb0: 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
dfc0: 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  By );.      rc =
dfd0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
dfe0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
dff0: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
e000: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
e010: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
e020: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
e030: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
e040: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
e050: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
e060: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
e070: 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
e080: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
e090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61 73   ){.         cas
e0a0: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f 70  e TK_EXCEPT:  op
e0b0: 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20 20   = SRT_Except;  
e0c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e0d0: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
e0e0: 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
e0f0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
e100: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
e110: 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 54  :     op = SRT_T
e120: 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b 0a  able;    break;.
e130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
e140: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
e150: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
e160: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 73   0;.      p->dis
e170: 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20 70  allowOrderBy = p
e180: 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20 20  OrderBy!=0;.    
e190: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
e1a0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
e1b0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
e1c0: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
e1d0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
e1e0: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
e1f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
e200: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
e210: 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30   op, unionTab, 0
e220: 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20 20  , 0, 0, aff);.  
e230: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
e240: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
e250: 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
e260: 65 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c 69  erBy;.      sqli
e270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d  te3ExprDelete(p-
e280: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
e290: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
e2a0: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
e2b0: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
e2c0: 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
e2d0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 69  = -1;.      p->i
e2e0: 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20 20  Offset = -1;.   
e2f0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e300: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
e310: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
e320: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
e330: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
e340: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
e350: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
e360: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
e370: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
e380: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
e390: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
e3a0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 21        if( eDest!
e3b0: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
e3c0: 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a 20  nTab!=iParm ){. 
e3d0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
e3e0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
e3f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e400: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
e410: 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74         if( eDest
e420: 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
e430: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
e440: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
e450: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
e460: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
e470: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
e480: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
e490: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
e4a0: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
e4b0: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
e4c0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
e4d0: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
e4e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e4f0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
e500: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
e510: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
e520: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
e530: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e540: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
e550: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
e560: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e570: 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
e580: 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  Tab, iBreak);.  
e590: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
e5a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e5b0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
e5c0: 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e 6e    rc = selectInn
e5d0: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
e5e0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
e5f0: 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74  onTab, p->pEList
e600: 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2c 20        pOrderBy, 
e630: 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d  -1, eDest, iParm
e640: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30  iCont, iBreak, 0
e670: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
e680: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
e690: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
e6a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e6b0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
e6c0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
e6d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e6e0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
e6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e700: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74  AddOp(v, OP_Next
e710: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
e720: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rt);.        sql
e730: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
e740: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
e750: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e760: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
e770: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
e780: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e7a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
e7b0: 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69  RSECT: {.      i
e7c0: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
e7d0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
e7e0: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
e7f0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
e800: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
e810: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20      int addr;.. 
e820: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
e830: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
e840: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
e850: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
e860: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
e870: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
e880: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
e890: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
e8a0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
e8b0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
e8c0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
e8d0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
e8e0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
e8f0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
e900: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
e910: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
e920: 70 4f 72 64 65 72 42 79 20 26 26 20 6d 61 74 63  pOrderBy && matc
e930: 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c 75 6d 6e  hOrderbyToColumn
e940: 28 70 50 61 72 73 65 2c 70 2c 70 4f 72 64 65 72  (pParse,p,pOrder
e950: 42 79 2c 74 61 62 31 2c 31 29 20 29 7b 0a 20 20  By,tab1,1) ){.  
e960: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
e970: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e980: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e990: 20 20 20 7d 0a 20 20 20 20 20 20 63 72 65 61 74     }.      creat
e9a0: 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50  eSortingIndex(pP
e9b0: 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42  arse, p, pOrderB
e9c0: 79 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20  y);..      addr 
e9d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e9e0: 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  Op(v, OP_OpenEph
e9f0: 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
ea00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ea10: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
ea20: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
ea30: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
ea40: 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
ea50: 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74     p->pRightmost
ea60: 2d 3e 75 73 65 73 45 70 68 6d 20 3d 20 31 3b 0a  ->usesEphm = 1;.
ea70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ea80: 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
ea90: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
eaa0: 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
eab0: 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
eac0: 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
ead0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
eae0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
eaf0: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
eb00: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
eb10: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
eb20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
eb30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
eb40: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
eb50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
eb60: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
eb70: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
eb80: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
eb90: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
eba0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
ebb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ebc0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
ebd0: 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
ebe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
ebf0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
ec00: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
ec10: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
ec20: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
ec30: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
ec40: 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
ec50: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
ec60: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
ec70: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
ec80: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
ec90: 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
eca0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
ecb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
ecc0: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32   SRT_Union, tab2
ecd0: 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b  , 0, 0, 0, aff);
ece0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
ecf0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
ed00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
ed10: 74 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  te(p->pLimit);. 
ed20: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
ed30: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
ed40: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
ed50: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72  set;.      if( r
ed60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
ed70: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
ed80: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
ed90: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
eda0: 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
edb0: 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
edc0: 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
edd0: 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
ede0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
edf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
ee00: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
ee10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c   eDest==SRT_Call
ee20: 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
ee30: 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
ee40: 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   p;.        whil
ee50: 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
ee60: 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
ee70: 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
ee80: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
ee90: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
eea0: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
eeb0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
eec0: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = 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 69 43 6f 6e 74  (v);.      iCont
eef0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ef00: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ef10: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
ef20: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
ef30: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
ef40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ef50: 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  Op(v, OP_Rewind,
ef60: 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a   tab1, iBreak);.
ef70: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
ef80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ef90: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
efa0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b1, 0);.      sq
efb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
efc0: 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
efd0: 61 62 32 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  ab2, iCont);.   
efe0: 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 49 6e     rc = selectIn
eff0: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
f000: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
f010: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
f020: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c     pOrderBy, -1,
f050: 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a   eDest, iParm, .
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
f080: 6e 74 2c 20 69 42 72 65 61 6b 2c 20 30 29 3b 0a  nt, iBreak, 0);.
f090: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
f0a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
f0b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
f0c0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
f0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f0e0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f0f0: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f110: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
f120: 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
f130: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f140: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
f150: 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
f160: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f170: 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  Op(v, OP_Close, 
f180: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
f190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f1a0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
f1b0: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
f1c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
f1d0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
f1e0: 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
f1f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
f200: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
f210: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
f220: 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
f230: 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
f240: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
f250: 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
f260: 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
f270: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
f280: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
f290: 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
f2a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f2b0: 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
f2c0: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
f2d0: 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22  t of %s".      "
f2e0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65   do not have the
f2f0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
f300: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c  result columns",
f310: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
f320: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
f330: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
f340: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
f350: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
f360: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
f370: 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  s in temporary t
f380: 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6e 43 6f  ables.  */.  nCo
f390: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
f3a0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Expr;.  while( n
f3b0: 53 65 74 50 32 20 29 7b 0a 20 20 20 20 73 71 6c  SetP2 ){.    sql
f3c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
f3d0: 28 76 2c 20 61 53 65 74 50 32 5b 2d 2d 6e 53 65  (v, aSetP2[--nSe
f3e0: 74 50 32 5d 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  tP2], nCol);.  }
f3f0: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
f400: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
f410: 65 73 20 75 73 65 64 20 62 79 20 65 69 74 68 65  es used by eithe
f420: 72 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  r the ORDER BY c
f430: 6c 61 75 73 65 20 6f 72 0a 20 20 2a 2a 20 62 79  lause or.  ** by
f440: 20 61 6e 79 20 74 65 6d 70 6f 72 61 72 79 20 74   any temporary t
f450: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
f460: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
f470: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
f480: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
f490: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
f4a0: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
f4b0: 79 20 74 61 62 6c 65 73 2e 20 20 49 6e 76 6f 6b  y tables.  Invok
f4c0: 65 20 74 68 65 0a 20 20 2a 2a 20 4f 52 44 45 52  e the.  ** ORDER
f4d0: 20 42 59 20 70 72 6f 63 65 73 73 69 6e 67 20 69   BY processing i
f4e0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
f4f0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
f500: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
f510: 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
f520: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
f530: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
f540: 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
f550: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
f560: 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
f570: 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
f580: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
f590: 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
f5a0: 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
f5b0: 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
f5c0: 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
f5d0: 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
f5e0: 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
f5f0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
f600: 69 66 28 20 70 4f 72 64 65 72 42 79 20 7c 7c 20  if( pOrderBy || 
f610: 70 2d 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20  p->usesEphm ){. 
f620: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
f650: 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
f660: 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
f670: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
f680: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
f690: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
f6a0: 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
f6b0: 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
f6c0: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
f6d0: 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
f6e0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
f6f0: 20 20 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b      int nKeyCol;
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
f720: 6e 74 72 69 65 73 20 69 6e 20 70 4b 65 79 49 6e  ntries in pKeyIn
f730: 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 2a 2f 0a 20 20  fo->aCol[] */.  
f740: 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
f750: 6c 6c 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  ll;.    CollSeq 
f760: 2a 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20 61 73  **aCopy;..    as
f770: 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
f780: 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 4b  ost==p );.    nK
f790: 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2b 20 28  eyCol = nCol + (
f7a0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65  pOrderBy ? pOrde
f7b0: 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  rBy->nExpr : 0);
f7c0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
f7d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
f7e0: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e  eof(*pKeyInfo)+n
f7f0: 4b 65 79 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43  KeyCol*(sizeof(C
f800: 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a  ollSeq*) + 1));.
f810: 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
f820: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
f830: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f840: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f850: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
f860: 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
f870: 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
f880: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49  ->db);.    pKeyI
f890: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43  nfo->nField = nC
f8a0: 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ol;..    for(i=0
f8b0: 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
f8c0: 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
f8d0: 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
f8e0: 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
f8f0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
f900: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
f910: 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
f920: 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
f930: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50      *apColl = pP
f940: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
f950: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
f960: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
f970: 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
f980: 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
f990: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
f9a0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
f9b0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
f9c0: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
f9d0: 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
f9e0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
f9f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
fa00: 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
fa10: 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
fa20: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
fa30: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
fa40: 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
fa50: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
fa60: 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
fa70: 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
fa80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
fa90: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
faa0: 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
fab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
fad0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fae0: 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
faf0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fb00: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
fb10: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
fb20: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
fb30: 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
fb40: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
fb50: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
fb60: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
fb70: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
fb80: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
fb90: 73 74 5f 69 74 65 6d 20 2a 70 4f 54 65 72 6d 20  st_item *pOTerm 
fba0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  = pOrderBy->a;. 
fbb0: 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 42       int nOrderB
fbc0: 79 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  yExpr = pOrderBy
fbd0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
fbe0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 75  nt addr;.      u
fbf0: 38 20 2a 70 53 6f 72 74 4f 72 64 65 72 3b 0a 0a  8 *pSortOrder;..
fc00: 20 20 20 20 20 20 61 43 6f 70 79 20 3d 20 26 70        aCopy = &p
fc10: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
fc20: 4f 72 64 65 72 42 79 45 78 70 72 5d 3b 0a 20 20  OrderByExpr];.  
fc30: 20 20 20 20 70 53 6f 72 74 4f 72 64 65 72 20 3d      pSortOrder =
fc40: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
fc50: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 61 43  Order = (u8*)&aC
fc60: 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20  opy[nCol];.     
fc70: 20 6d 65 6d 63 70 79 28 61 43 6f 70 79 2c 20 70   memcpy(aCopy, p
fc80: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 2c 20  KeyInfo->aColl, 
fc90: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  nCol*sizeof(Coll
fca0: 53 65 71 2a 29 29 3b 0a 20 20 20 20 20 20 61 70  Seq*));.      ap
fcb0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
fcc0: 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 66 6f  >aColl;.      fo
fcd0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
fce0: 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4f 54 65  yExpr; i++, pOTe
fcf0: 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 2c 20  rm++, apColl++, 
fd00: 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29 7b 0a 20  pSortOrder++){. 
fd10: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
fd20: 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 70 45 78  pr = pOTerm->pEx
fd30: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
fd40: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
fd50: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 29  EP_ExpCollate) )
fd60: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
fd70: 72 74 28 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  rt( pExpr->pColl
fd80: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
fd90: 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72   *apColl = pExpr
fda0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ->pColl;.       
fdb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fdc0: 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 61 43 6f 70    *apColl = aCop
fdd0: 79 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  y[pExpr->iColumn
fde0: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
fdf0: 20 20 20 20 20 2a 70 53 6f 72 74 4f 72 64 65 72       *pSortOrder
fe00: 20 3d 20 70 4f 54 65 72 6d 2d 3e 73 6f 72 74 4f   = pOTerm->sortO
fe10: 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rder;.      }.  
fe20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
fe30: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a  Rightmost==p );.
fe40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
fe50: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
fe60: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  >=0 );.      add
fe70: 72 20 3d 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  r = p->addrOpenE
fe80: 70 68 6d 5b 32 5d 3b 0a 20 20 20 20 20 20 73 71  phm[2];.      sq
fe90: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fea0: 32 28 76 2c 20 61 64 64 72 2c 20 70 2d 3e 70 45  2(v, addr, p->pE
feb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a  List->nExpr+2);.
fec0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
fed0: 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42  nField = nOrderB
fee0: 79 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  yExpr;.      sql
fef0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
ff00: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
ff10: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
ff20: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
ff30: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
ff40: 20 30 3b 0a 20 20 20 20 20 20 67 65 6e 65 72 61   0;.      genera
ff50: 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
ff60: 65 2c 20 70 2c 20 76 2c 20 70 2d 3e 70 45 4c 69  e, p, v, p->pELi
ff70: 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
ff80: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 7d 0a  , iParm);.    }.
ff90: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
ffa0: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
ffb0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
ffc0: 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
ffd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ffe0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
fff0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
10000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10010 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  IEW./*.** Scan t
10020 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
10030 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
10040 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
10050 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
10060 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
10070 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
10080 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
10090 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
100a0 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
100b0 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
100c0 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
100d0 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
100e0 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
100f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
10100 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
10110 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
10120 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
10130 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
10140 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
10150 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
10160 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
10170 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
10180 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
10190 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
101a0 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
101b0 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
101c0 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
101d0 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
101e0 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
101f0 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
10200 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
10210 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
10220 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
10230 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
10240 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
10250 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
10260 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
10270 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
10280 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
10290 45 78 70 72 4c 69 73 74 2a 2c 69 6e 74 2c 45 78  ExprList*,int,Ex
102a0 70 72 4c 69 73 74 2a 29 3b 20 20 2f 2a 20 46 6f  prList*);  /* Fo
102b0 72 77 61 72 64 20 44 65 63 6c 20 2a 2f 0a 73 74  rward Decl */.st
102c0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
102d0 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 2c 20  elect(Select *, 
102e0 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
102f0 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;  /* Forward De
10300 63 6c 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  cl */.static voi
10310 64 20 73 75 62 73 74 45 78 70 72 28 45 78 70 72  d substExpr(Expr
10320 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 69 54 61   *pExpr, int iTa
10330 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  ble, ExprList *p
10340 45 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 45  EList){.  if( pE
10350 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
10360 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
10370 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
10380 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Expr->iTable==iT
10390 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
103a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
103b0 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
103c0 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
103d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
103e0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
103f0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
10400 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43  !=0 && pExpr->iC
10410 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45  olumn<pEList->nE
10420 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
10430 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
10440 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
10450 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70  Right==0 && pExp
10460 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
10470 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69       pNew = pELi
10480 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f  st->a[pExpr->iCo
10490 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20  lumn].pExpr;.   
104a0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21     assert( pNew!
104b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
104c0 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70  r->op = pNew->op
104d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
104e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
104f0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
10500 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
10510 78 70 72 44 75 70 28 70 4e 65 77 2d 3e 70 4c 65  xprDup(pNew->pLe
10520 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ft);.      asser
10530 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t( pExpr->pRight
10540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
10550 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  pr->pRight = sql
10560 69 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77  ite3ExprDup(pNew
10570 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
10580 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10590 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
105a0 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d    pExpr->pList =
105b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
105c0 44 75 70 28 70 4e 65 77 2d 3e 70 4c 69 73 74 29  Dup(pNew->pList)
105d0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
105e0 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54  Table = pNew->iT
105f0 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70  able;.      pExp
10600 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e  r->pTab = pNew->
10610 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70  pTab;.      pExp
10620 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65  r->iColumn = pNe
10630 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  w->iColumn;.    
10640 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
10650 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20  pNew->iAgg;.    
10660 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
10670 70 79 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  py(&pExpr->token
10680 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b  , &pNew->token);
10690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
106a0 6b 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e  kenCopy(&pExpr->
106b0 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61  span, &pNew->spa
106c0 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
106d0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
106e0 65 33 53 65 6c 65 63 74 44 75 70 28 70 4e 65 77  e3SelectDup(pNew
106f0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
10700 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d    pExpr->flags =
10710 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20   pNew->flags;.  
10720 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
10730 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70 72   substExpr(pExpr
10740 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c  ->pLeft, iTable,
10750 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
10760 62 73 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70  bstExpr(pExpr->p
10770 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
10780 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
10790 74 53 65 6c 65 63 74 28 70 45 78 70 72 2d 3e 70  tSelect(pExpr->p
107a0 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
107b0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
107c0 73 74 45 78 70 72 4c 69 73 74 28 70 45 78 70 72  stExprList(pExpr
107d0 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  ->pList, iTable,
107e0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
107f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
10800 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69  tExprList(ExprLi
10810 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
10820 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74 20  Table, ExprList 
10830 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20  *pEList){.  int 
10840 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
10850 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
10860 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
10870 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
10880 20 73 75 62 73 74 45 78 70 72 28 70 4c 69 73 74   substExpr(pList
10890 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
108a0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
108b0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
108c0 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 65 6c   substSelect(Sel
108d0 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ect *p, int iTab
108e0 6c 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45  le, ExprList *pE
108f0 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 21 70 20  List){.  if( !p 
10900 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
10910 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
10920 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
10930 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
10940 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
10950 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
10960 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
10970 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c  ist(p->pOrderBy,
10980 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
10990 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 70 2d  ;.  substExpr(p-
109a0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
109b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
109c0 73 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  stExpr(p->pWhere
109d0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
109e0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
109f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10a00 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
10a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10a20 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 69  T_VIEW./*.** Thi
10a30 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
10a40 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
10a50 62 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65  bqueries in orde
10a60 72 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78  r to speed.** ex
10a70 65 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  ecution.  It ret
10a80 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
10a90 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
10aa0 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
10ab0 67 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  g.** occurs..**.
10ac0 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
10ad0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
10ae0 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
10af0 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
10b00 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
10b10 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
10b20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
10b30 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
10b40 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
10b50 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
10b60 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
10b70 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
10b80 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
10b90 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
10ba0 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
10bb0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
10bc0 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
10bd0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
10be0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
10bf0 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
10c00 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
10c10 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
10c20 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
10c30 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
10c40 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
10c50 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10c60 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
10c70 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
10c80 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
10c90 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
10ca0 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
10cb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10cc0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
10cd0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
10ce0 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
10cf0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
10d00 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
10d10 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
10d20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
10d30 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
10d40 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
10d50 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
10d60 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
10d70 73 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20  s simpification 
10d80 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
10d90 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
10da0 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
10db0 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
10dc0 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
10dd0 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
10de0 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
10df0 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
10e00 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
10e10 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
10e20 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
10e30 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74  ning is only att
10e40 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66  empted if all of
10e50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
10e60 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
10e70 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
10e80 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
10e90 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
10ea0 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65  th use aggregate
10eb0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20  s..**.**   (2)  
10ec0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
10ed0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
10ee0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
10ef0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
10f00 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20  n..**.**   (3)  
10f10 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
10f20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70  not the right op
10f30 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
10f40 6f 75 74 65 72 20 6a 6f 69 6e 2c 20 6f 72 0a 2a  outer join, or.*
10f50 2a 20 20 20 20 20 20 20 20 74 68 65 20 73 75 62  *        the sub
10f60 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
10f70 65 6c 66 20 61 20 6a 6f 69 6e 2e 20 20 28 54 69  elf a join.  (Ti
10f80 63 6b 65 74 20 23 33 30 36 29 0a 2a 2a 0a 2a 2a  cket #306).**.**
10f90 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
10fa0 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
10fb0 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
10fc0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
10fd0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
10fe0 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
10ff0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
11000 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
11010 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
11020 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
11030 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
11040 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
11050 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
11060 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
11070 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
11080 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
11090 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
110a0 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
110b0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
110c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
110d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
110e0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
110f0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
11100 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
11110 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
11120 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
11130 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
11140 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
11150 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
11160 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
11170 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
11180 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11190 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
111a0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
111b0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
111c0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
111d0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
111e0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
111f0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
11200 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
11210 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
11220 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
11230 20 28 31 32 29 20 20 54 68 65 20 73 75 62 71 75   (12)  The subqu
11240 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
11250 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
11260 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 6f  EFT OUTER JOIN o
11270 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
11280 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
11290 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 28  WHERE clause.  (
112a0 61 64 64 65 64 20 62 79 20 74 69 63 6b 65 74 20  added by ticket 
112b0 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350).**.**  (13
112c0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
112d0 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
112e0 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
112f0 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34  LIMIT.**.**  (14
11300 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
11310 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46  does not use OFF
11320 53 45 54 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  SET.**.** In thi
11330 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
11340 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
11350 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11360 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
11370 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
11380 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
11390 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
113a0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
113b0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
113c0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
113d0 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
113e0 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
113f0 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
11400 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
11410 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
11420 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
11430 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11440 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
11450 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
11460 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
11470 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
11480 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
11490 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
114a0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
114b0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
114c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
114d0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
114e0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
114f0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
11500 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
11510 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 53 65  enSubquery(.  Se
11520 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11530 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
11540 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
11550 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11560 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
11570 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
11580 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
11590 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
115a0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
115b0 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
115c0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
115d0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
115e0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
115f0 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
11600 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
11610 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
11620 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
11630 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
11640 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
11650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
11660 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
11670 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 72 63 4c  query" */.  SrcL
11680 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
11690 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
116a0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
116b0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
116c0 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
116d0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
116e0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
116f0 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
11700 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
11710 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
11720 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11730 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
11740 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
11750 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
11760 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
11770 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
11780 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
117a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
117b0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
117e0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
117f0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
11800 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
11810 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 0a 20 20   subquery */..  
11820 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
11830 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
11840 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
11850 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
11860 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  */.  if( p==0 ) 
11870 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
11880 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
11890 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
118a0 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
118b0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
118c0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
118d0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 70 53  ->a[iFrom];.  pS
118e0 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
118f0 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
11900 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
11910 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
11920 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
11930 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11940 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11950 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69  tion (1)  */.  i
11960 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
11970 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
11980 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11990 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
119a0 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70  tion (2)  */.  p
119b0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
119c0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
119d0 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
119e0 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
119f0 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
11a00 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
11a10 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
11a20 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
11a30 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
11a40 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  esssions, we all
11a50 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
11a60 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
11a70 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
11a80 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
11a90 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
11aa0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
11ab0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
11ac0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
11ad0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
11ae0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
11af0 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
11b00 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
11b10 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
11b20 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
11b30 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
11b40 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b60 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
11b70 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
11b80 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
11b90 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11bb0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
11bc0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53  ) */.  if( pSubS
11bd0 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65  rc->nSrc==0 ) re
11be0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29   Restriction (7)
11c10 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
11c20 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c 20  ->isDistinct || 
11c30 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20  pSub->pLimit) . 
11c40 20 20 20 20 20 20 20 20 26 26 20 28 70 53 72 63          && (pSrc
11c50 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
11c60 67 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  g) ){          /
11c70 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
11c80 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f 0a 20  4)(5)(8)(9) */. 
11c90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
11ca0 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28 20 70      .  }.  if( p
11cb0 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 26 26 20  ->isDistinct && 
11cc0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
11cd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11ce0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
11cf0 20 28 36 29 20 20 2a 2f 0a 20 20 69 66 28 20 28   (6)  */.  if( (
11d00 70 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72  p->disallowOrder
11d10 42 79 20 7c 7c 20 70 2d 3e 70 4f 72 64 65 72 42  By || p->pOrderB
11d20 79 29 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  y) && pSub->pOrd
11d30 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
11d40 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
11d80 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (11) */.  }..  /
11d90 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
11da0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
11db0 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
11dc0 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
11dd0 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
11de0 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
11df0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
11e00 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
11e10 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
11e20 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
11e30 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
11e40 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
11e50 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
11e60 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
11e70 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
11e80 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
11e90 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
11ea0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
11eb0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
11ec0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
11ed0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
11ee0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
11ef0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  me thing..  */. 
11f00 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
11f10 72 63 3e 31 20 26 26 20 28 70 53 75 62 69 74 65  rc>1 && (pSubite
11f20 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
11f30 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
11f40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11f50 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
11f60 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
11f70 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
11f80 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
11f90 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
11fa0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
11fb0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
11fc0 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
11fd0 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
11fe0 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
11ff0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
12000 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
12010 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
12020 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
12030 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
12040 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
12050 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
12060 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
12070 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
12080 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
12090 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
120a0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
120b0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
120c0 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
120d0 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
120e0 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
120f0 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
12100 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
12110 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
12120 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
12130 4e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  N..  */.  if( (p
12140 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
12150 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
12160 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
12170 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
12180 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
12190 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
121a0 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
121b0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
121c0 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
121d0 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
121e0 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
121f0 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
12200 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
12210 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
12220 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
12230 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
12240 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
12250 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
12260 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
12270 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
12280 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
12290 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
122a0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
122b0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
122c0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
122d0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
122e0 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
122f0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
12300 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
12310 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
12320 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
12330 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
12340 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
12350 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
12360 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
12370 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
12380 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
12390 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
123a0 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
123b0 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
123c0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
123d0 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
123e0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
123f0 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
12400 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
12410 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
12420 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
12430 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
12440 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ;..    sqlite3De
12450 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75  leteTable(0, pSu
12460 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  bitem->pTab);.  
12470 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
12480 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
12490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
124a0 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  e(pSubitem->zNam
124b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
124c0 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  ee(pSubitem->zAl
124d0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
124e0 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
124f0 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
12500 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
12510 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
12520 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
12530 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
12540 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
12550 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
12560 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
12570 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
12580 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
12590 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
125a0 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
125b0 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
125c0 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
125d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
125e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
125f0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
12600 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
12610 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
12620 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
12630 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
12640 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
12650 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
12660 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
12670 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  rom].jointype = 
12680 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 7d 0a 0a 20  jointype;.  }.. 
12690 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
126a0 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
126b0 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
126c0 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
126d0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
126e0 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69  to the iParent i
126f0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
12700 79 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 45 78  y..  ** .  ** Ex
12710 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
12720 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
12730 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
12740 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
12750 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
12760 45 52 45 20 61 3e 62 3b 0a 20 20 2a 2a 20 20 20  ERE a>b;.  **   
12770 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
12780 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
12790 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
127a0 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
127b0 20 20 20 2f 0a 20 20 2a 2a 20 20 20 20 5c 5f 5f     /.  **    \__
127c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
127d0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
127e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
127f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
12800 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 6c 6f 6f    **.  ** We loo
12810 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65  k at every expre
12820 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74  ssion in the out
12830 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65  er query and eve
12840 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a  ry place we see.
12850 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
12860 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
12870 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
12880 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
12890 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
128a0 2a 2f 0a 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e  */.  pList = p->
128b0 70 45 4c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d  pEList;.  for(i=
128c0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
128d0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
128e0 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 69 66  r *pExpr;.    if
128f0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
12900 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70 72  ame==0 && (pExpr
12910 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
12920 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30  Expr)->span.z!=0
12930 20 29 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   ){.      pList-
12940 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
12950 6c 69 74 65 53 74 72 4e 44 75 70 28 28 63 68 61  liteStrNDup((cha
12960 72 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  r*)pExpr->span.z
12970 2c 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29  , pExpr->span.n)
12980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 75  ;.    }.  }.  su
12990 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  bstExprList(p->p
129a0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
129b0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
129c0 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
129d0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
129e0 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  p->pGroupBy, iPa
129f0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
12a00 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78  st);.    substEx
12a10 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  pr(p->pHaving, i
12a20 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
12a30 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
12a40 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
12a50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12a60 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
12a70 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
12a80 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
12a90 79 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  y;.    pSub->pOr
12aa0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  derBy = 0;.  }el
12ab0 73 65 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  se if( p->pOrder
12ac0 42 79 20 29 7b 0a 20 20 20 20 73 75 62 73 74 45  By ){.    substE
12ad0 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
12ae0 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
12af0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  ub->pEList);.  }
12b00 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68  .  if( pSub->pWh
12b10 65 72 65 20 29 7b 0a 20 20 20 20 70 57 68 65 72  ere ){.    pWher
12b20 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
12b30 75 70 28 70 53 75 62 2d 3e 70 57 68 65 72 65 29  up(pSub->pWhere)
12b40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12b50 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
12b60 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
12b70 67 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  gg ){.    assert
12b80 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
12b90 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
12ba0 67 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  g = p->pWhere;. 
12bb0 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 70     p->pWhere = p
12bc0 57 68 65 72 65 3b 0a 20 20 20 20 73 75 62 73 74  Where;.    subst
12bd0 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c  Expr(p->pHaving,
12be0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
12bf0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
12c00 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
12c10 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 48 61 76  3ExprAnd(p->pHav
12c20 69 6e 67 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ing, sqlite3Expr
12c30 44 75 70 28 70 53 75 62 2d 3e 70 48 61 76 69 6e  Dup(pSub->pHavin
12c40 67 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  g));.    assert(
12c50 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
12c60 29 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  );.    p->pGroup
12c70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
12c80 4c 69 73 74 44 75 70 28 70 53 75 62 2d 3e 70 47  ListDup(pSub->pG
12c90 72 6f 75 70 42 79 29 3b 0a 20 20 7d 65 6c 73 65  roupBy);.  }else
12ca0 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28  {.    substExpr(
12cb0 70 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  p->pWhere, iPare
12cc0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
12cd0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
12ce0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
12cf0 64 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  d(p->pWhere, pWh
12d00 65 72 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ere);.  }..  /* 
12d10 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
12d20 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
12d30 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
12d40 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ner or the.  ** 
12d50 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
12d60 69 73 74 69 6e 63 74 2e 20 0a 20 20 2a 2f 0a 20  istinct. .  */. 
12d70 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
12d80 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c   p->isDistinct |
12d90 7c 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e  | pSub->isDistin
12da0 63 74 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53  ct;..  /*.  ** S
12db0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
12dc0 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
12dd0 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
12de0 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
12df0 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 65 20 69 73 20   **.  ** One is 
12e00 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
12e10 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
12e20 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
12e30 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
12e40 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
12e50 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
12e60 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
12e70 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
12e80 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
12e90 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
12ea0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 53 75 62  pLimit;.    pSub
12eb0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
12ec0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
12ed0 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
12ee0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
12ef0 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
12f00 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
12f10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
12f20 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 29 3b  ectDelete(pSub);
12f30 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
12f40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12f50 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
12f60 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
12f70 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12f80 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 61 6e   passed in as an
12f90 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65   argument to see
12fa0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 73   if it.** is a s
12fb0 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
12fc0 61 78 28 29 20 71 75 65 72 79 2e 20 20 49 66 20  ax() query.  If 
12fd0 69 74 20 69 73 20 61 6e 64 20 74 68 69 73 20 71  it is and this q
12fe0 75 65 72 79 20 63 61 6e 20 62 65 0a 2a 2a 20 73  uery can be.** s
12ff0 61 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 61  atisfied using a
13000 20 73 69 6e 67 6c 65 20 73 65 65 6b 20 74 6f 20   single seek to 
13010 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 72  the beginning or
13020 20 65 6e 64 20 6f 66 20 61 6e 20 69 6e 64 65 78   end of an index
13030 2c 0a 2a 2a 20 74 68 65 6e 20 67 65 6e 65 72 61  ,.** then genera
13040 74 65 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  te the code for 
13050 74 68 69 73 20 53 45 4c 45 43 54 20 61 6e 64 20  this SELECT and 
13060 72 65 74 75 72 6e 20 31 2e 20 20 49 66 20 74 68  return 1.  If th
13070 69 73 20 69 73 20 6e 6f 74 20 61 20 0a 2a 2a 20  is is not a .** 
13080 73 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20  simple min() or 
13090 6d 61 78 28 29 20 71 75 65 72 79 2c 20 74 68 65  max() query, the
130a0 6e 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 0a 2a  n return 0;.**.*
130b0 2a 20 41 20 73 69 6d 70 6c 79 20 6d 69 6e 28 29  * A simply min()
130c0 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 20   or max() query 
130d0 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
130e0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
130f0 20 6d 69 6e 28 61 29 20 46 52 4f 4d 20 74 61 62   min(a) FROM tab
13100 6c 65 3b 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  le;.**    SELECT
13110 20 6d 61 78 28 61 29 20 46 52 4f 4d 20 74 61 62   max(a) FROM tab
13120 6c 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75  le;.**.** The qu
13130 65 72 79 20 6d 61 79 20 68 61 76 65 20 6f 6e 6c  ery may have onl
13140 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
13150 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 61 72 67   in its FROM arg
13160 75 6d 65 6e 74 2e 20 20 54 68 65 72 65 0a 2a 2a  ument.  There.**
13170 20 63 61 6e 20 62 65 20 6e 6f 20 47 52 4f 55 50   can be no GROUP
13180 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 6f 72   BY or HAVING or
13190 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
131a0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
131b0 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 6d  must.** be the m
131c0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 6f 66  in() or max() of
131d0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
131e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
131f0 54 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 6e  The column.** in
13200 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
13210 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
13220 74 20 62 65 20 69 6e 64 65 78 65 64 2e 0a 2a 2a  t be indexed..**
13230 0a 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65  .** The paramete
13240 72 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  rs to this routi
13250 6e 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ne are the same 
13260 61 73 20 66 6f 72 20 73 71 6c 69 74 65 33 53 65  as for sqlite3Se
13270 6c 65 63 74 28 29 2e 0a 2a 2a 20 53 65 65 20 74  lect()..** See t
13280 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
13290 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e  t on that routin
132a0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
132b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
132c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 6d 70  .static int simp
132d0 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28 50 61  leMinMaxQuery(Pa
132e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
132f0 65 63 74 20 2a 70 2c 20 69 6e 74 20 65 44 65 73  ect *p, int eDes
13300 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
13310 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
13320 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 54 61 62 6c  int iCol;.  Tabl
13330 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78  e *pTab;.  Index
13340 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 62 61   *pIdx;.  int ba
13350 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  se;.  Vdbe *v;. 
13360 20 69 6e 74 20 73 65 65 6b 4f 70 3b 0a 20 20 45   int seekOp;.  E
13370 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
13380 20 2a 70 4c 69 73 74 2c 20 65 4c 69 73 74 3b 0a   *pList, eList;.
13390 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
133a0 74 5f 69 74 65 6d 20 65 4c 69 73 74 49 74 65 6d  t_item eListItem
133b0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
133c0 63 3b 0a 20 20 69 6e 74 20 62 72 6b 3b 0a 20 20  c;.  int brk;.  
133d0 69 6e 74 20 69 44 62 3b 0a 0a 20 20 2f 2a 20 43  int iDb;..  /* C
133e0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
133f0 68 69 73 20 71 75 65 72 79 20 69 73 20 61 20 73  his query is a s
13400 69 6d 70 6c 65 20 6d 69 6e 28 29 20 6f 72 20 6d  imple min() or m
13410 61 78 28 29 20 71 75 65 72 79 2e 20 20 52 65 74  ax() query.  Ret
13420 75 72 6e 0a 20 20 2a 2a 20 7a 65 72 6f 20 69 66  urn.  ** zero if
13430 20 69 74 20 69 73 20 20 6e 6f 74 2e 0a 20 20 2a   it is  not..  *
13440 2f 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  /.  if( p->pGrou
13450 70 42 79 20 7c 7c 20 70 2d 3e 70 48 61 76 69 6e  pBy || p->pHavin
13460 67 20 7c 7c 20 70 2d 3e 70 57 68 65 72 65 20 29  g || p->pWhere )
13470 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
13480 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  c = p->pSrc;.  i
13490 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
134a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
134b0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
134c0 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  t;.  if( pEList-
134d0 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
134e0 72 6e 20 30 3b 0a 20 20 70 45 78 70 72 20 3d 20  rn 0;.  pExpr = 
134f0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
13500 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
13510 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
13520 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
13530 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72  .  pList = pExpr
13540 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
13550 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74  List==0 || pList
13560 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
13570 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
13580 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29  pr->token.n!=3 )
13590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
135a0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
135b0 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
135c0 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d  oken.z,"min",3)=
135d0 3d 30 20 29 7b 0a 20 20 20 20 73 65 65 6b 4f 70  =0 ){.    seekOp
135e0 20 3d 20 4f 50 5f 52 65 77 69 6e 64 3b 0a 20 20   = OP_Rewind;.  
135f0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
13600 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
13610 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
13620 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
13630 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4c     seekOp = OP_L
13640 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
13650 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13660 20 20 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    pExpr = pList-
13670 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
13680 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
13690 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
136a0 20 30 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 45 78   0;.  iCol = pEx
136b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70  pr->iColumn;.  p
136c0 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30 5d  Tab = pSrc->a[0]
136d0 2e 70 54 61 62 3b 0a 0a 0a 20 20 2f 2a 20 49 66  .pTab;...  /* If
136e0 20 77 65 20 67 65 74 20 74 6f 20 68 65 72 65 2c   we get to here,
136f0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 71 75   it means the qu
13700 65 72 79 20 69 73 20 6f 66 20 74 68 65 20 63 6f  ery is of the co
13710 72 72 65 63 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a  rrect form..  **
13720 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
13730 75 72 65 20 77 65 20 68 61 76 65 20 61 6e 20 69  ure we have an i
13740 6e 64 65 78 20 61 6e 64 20 6d 61 6b 65 20 70 49  ndex and make pI
13750 64 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  dx point to the.
13760 20 20 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65    ** appropriate
13770 20 69 6e 64 65 78 2e 20 20 49 66 20 74 68 65 20   index.  If the 
13780 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 69  min() or max() i
13790 73 20 6f 6e 20 61 6e 20 49 4e 54 45 47 45 52 20  s on an INTEGER 
137a0 50 52 49 4d 41 52 59 0a 20 20 2a 2a 20 6b 65 79  PRIMARY.  ** key
137b0 20 63 6f 6c 75 6d 6e 2c 20 6e 6f 20 69 6e 64 65   column, no inde
137c0 78 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  x is necessary s
137d0 6f 20 73 65 74 20 70 49 64 78 20 74 6f 20 4e 55  o set pIdx to NU
137e0 4c 4c 2e 20 20 49 66 20 6e 6f 0a 20 20 2a 2a 20  LL.  If no.  ** 
137f0 75 73 61 62 6c 65 20 69 6e 64 65 78 20 69 73 20  usable index is 
13800 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 30 2e  found, return 0.
13810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c  .  */.  if( iCol
13820 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 20 3d  <0 ){.    pIdx =
13830 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
13840 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
13850 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
13860 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
13870 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  pr);.    if( pCo
13880 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ll==0 ) return 0
13890 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
138a0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
138b0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
138c0 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
138d0 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
138e0 6e 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n>=1 );.      if
138f0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
13900 5b 30 5d 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20  [0]==iCol && .  
13910 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
13920 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e  e3StrICmp(pIdx->
13930 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c  azColl[0], pColl
13940 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ->zName) ){.    
13950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13960 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13970 20 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72   pIdx==0 ) retur
13980 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
13990 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74  dentify column t
139a0 79 70 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20  ypes if we will 
139b0 62 65 20 75 73 69 6e 67 20 74 68 65 20 63 61 6c  be using the cal
139c0 6c 62 61 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a  lback.  This.  *
139d0 2a 20 73 74 65 70 20 69 73 20 73 6b 69 70 70 65  * step is skippe
139e0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  d if the output 
139f0 69 73 20 67 6f 69 6e 67 20 74 6f 20 61 20 74 61  is going to a ta
13a00 62 6c 65 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20  ble or a memory 
13a10 63 65 6c 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63  cell..  ** The c
13a20 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65  olumn names have
13a30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67 65   already been ge
13a40 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 20 63  nerated in the c
13a50 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
13a60 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
13a70 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13a80 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
13a90 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
13aa0 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
13ab0 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
13ac0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
13ad0 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
13ae0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 44  e..  */.  if( eD
13af0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
13b00 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
13b10 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13b20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
13b30 50 61 72 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  Parm, 1);.  }.. 
13b40 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 63   /* Generating c
13b50 6f 64 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ode to find the 
13b60 6d 69 6e 20 6f 72 20 74 68 65 20 6d 61 78 2e 20  min or the max. 
13b70 20 42 61 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77   Basically all w
13b80 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
13b90 6f 20 69 73 20 66 69 6e 64 20 74 68 65 20 66 69  o is find the fi
13ba0 72 73 74 20 6f 72 20 74 68 65 20 6c 61 73 74 20  rst or the last 
13bb0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 68 6f  entry in the cho
13bc0 73 65 6e 20 69 6e 64 65 78 2e 20 20 49 66 0a 20  sen index.  If. 
13bd0 20 2a 2a 20 74 68 65 20 6d 69 6e 28 29 20 6f 72   ** the min() or
13be0 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 74 68 65   max() is on the
13bf0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
13c00 20 4b 45 59 2c 20 74 68 65 6e 20 66 69 6e 64 20   KEY, then find 
13c10 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f  the first.  ** o
13c20 72 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  r last entry in 
13c30 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
13c40 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c    */.  iDb = sql
13c50 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13c60 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
13c70 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13c80 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 7c  assert( iDb>=0 |
13c90 7c 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20  | pTab->isEphem 
13ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65  );.  sqlite3Code
13cb0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
13cc0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
13cd0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
13ce0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
13cf0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
13d00 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20 3d  zName);.  base =
13d10 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72   pSrc->a[0].iCur
13d20 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71 6c  sor;.  brk = sql
13d30 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
13d40 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
13d50 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
13d60 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a 20  arse, p, brk);. 
13d70 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d 2e   if( pSrc->a[0].
13d80 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
13d90 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
13da0 6c 65 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c  le(pParse, base,
13db0 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
13dc0 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20 20  penRead);.  }.  
13dd0 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20  if( pIdx==0 ){. 
13de0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13df0 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 62  dOp(v, seekOp, b
13e00 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  ase, 0);.  }else
13e10 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74 68  {.    /* Even th
13e20 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72 20  ough the cursor 
13e30 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
13e40 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20 63   index here is c
13e50 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73 20  losed.    ** as 
13e60 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c 65  soon as a single
13e70 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e 20   value has been 
13e80 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61 6c  read from it, al
13e90 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  locate it.    **
13ea0 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d 3e   using (pParse->
13eb0 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76 65  nTab++) to preve
13ec0 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 64  nt the cursor id
13ed0 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20 20   from being .   
13ee0 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69 73   ** reused. This
13ef0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f   is important fo
13f00 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20  r statements of 
13f10 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a 2a  the form .    **
13f20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20   "INSERT INTO x 
13f30 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52 4f  SELECT max() FRO
13f40 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  M x"..    */.   
13f50 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20 4b   int iIdx;.    K
13f60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
13f70 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
13f80 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
13f90 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50 61  ;.    iIdx = pPa
13fa0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
13fb0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
13fc0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13fd0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
13fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13ff0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62   OP_Integer, iDb
14000 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14010 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
14020 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20 70  penRead, iIdx, p
14030 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20 20  Idx->tnum, .    
14040 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c      (char*)pKey,
14050 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P3_KEYINFO_HAND
14060 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73 65  OFF);.    if( se
14070 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20  ekOp==OP_Rewind 
14080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14090 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
140a0 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Null, 0, 0);.   
140b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
140c0 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  dOp(v, OP_MakeRe
140d0 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20 20  cord, 1, 0);.   
140e0 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f 4d     seekOp = OP_M
140f0 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20 20  oveGt;.    }.   
14100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14110 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49 64  p(v, seekOp, iId
14120 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
14130 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14140 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
14150 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14160 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14170 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30 29  _Close, iIdx, 0)
14180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14190 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76  eAddOp(v, OP_Mov
141a0 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a 20  eGe, base, 0);. 
141b0 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70 72   }.  eList.nExpr
141c0 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 1;.  memset(&
141d0 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73 69  eListItem, 0, si
141e0 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29 29  zeof(eListItem))
141f0 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26 65  ;.  eList.a = &e
14200 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69 73  ListItem;.  eLis
14210 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70  t.a[0].pExpr = p
14220 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49 6e  Expr;.  selectIn
14230 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
14240 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30 2c  p, &eList, 0, 0,
14250 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69   0, -1, eDest, i
14260 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c 20  Parm, brk, brk, 
14270 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
14280 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14290 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33   brk);.  sqlite3
142a0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
142b0 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29 3b  Close, base, 0);
142c0 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  .  .  return 1;.
142d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
142e0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f 72   and ORDER BY or
142f0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
14300 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61   in a SELECT sta
14310 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
14320 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
14330 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2a   errors seen..**
14340 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20  .** An ORDER BY 
14350 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20 61  or GROUP BY is a
14360 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
14370 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65 78  ions.  If any ex
14380 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  pression.** is a
14390 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
143a0 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65 78  nt, then that ex
143b0 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70 6c  pression is repl
143c0 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  aced by the.** c
143d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e 74  orresponding ent
143e0 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ry in the result
143f0 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
14400 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65 72  int processOrder
14410 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
14420 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
14430 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
14440 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
14450 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 45  tatement. */.  E
14460 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
14470 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
14480 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
14490 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
144a0 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
144b0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
144c0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
144d0 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
144e0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
144f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14500 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14510 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
14520 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75       /* The resu
14530 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
14540 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65 20  LECT */.  Parse 
14550 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
14560 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54 68  Parse;     /* Th
14570 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
14580 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  the SELECT */.  
14590 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20 29  assert( pEList )
145a0 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
145b0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
145c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
145d0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
145e0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  ++){.    int iCo
145f0 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  l;.    Expr *pE 
14600 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
14610 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
14620 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
14630 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
14640 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  ){.      if( iCo
14650 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45 4c  l>0 && iCol<=pEL
14660 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
14670 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
14680 43 6f 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c  Coll = pE->pColl
14690 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
146a0 61 67 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20  ags = pE->flags 
146b0 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b  & EP_ExpCollate;
146c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
146d0 45 78 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a  ExprDelete(pE);.
146e0 20 20 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72          pE = pOr
146f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
14700 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
14710 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  up(pEList->a[iCo
14720 6c 2d 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  l-1].pExpr);.   
14730 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26       if( pColl &
14740 26 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  & flags ){.     
14750 20 20 20 20 20 70 45 2d 3e 70 43 6f 6c 6c 20 3d       pE->pColl =
14760 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pColl;.        
14770 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d 20 66    pE->flags |= f
14780 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lags;.        }.
14790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
147a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
147b0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
147c0 20 20 20 20 20 20 20 20 20 22 25 73 20 42 59 20           "%s BY 
147d0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 25 64  column number %d
147e0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20   out of range - 
147f0 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20  should be ".    
14800 20 20 20 20 20 20 20 22 62 65 74 77 65 65 6e 20         "between 
14810 31 20 61 6e 64 20 25 64 22 2c 20 7a 54 79 70 65  1 and %d", zType
14820 2c 20 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e  , iCol, pEList->
14830 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
14840 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
14850 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14860 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
14870 76 65 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29  veNames(pNC, pE)
14880 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14890 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
148a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
148b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
148c0 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e 61 6d  resolves any nam
148d0 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 72  es used in the r
148e0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
148f0 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53 45 4c  .** supplied SEL
14900 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  ECT statement. I
14910 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
14920 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 73  tement being res
14930 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20 73 75  olved.** is a su
14940 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 70  b-select, then p
14950 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70 6f 69  OuterNC is a poi
14960 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61 6d 65  nter to the Name
14970 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66 20 74  Context .** of t
14980 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
14990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
149a0 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 0a 20  SelectResolve(. 
149b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
149c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
149d0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
149e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
149f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14a00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14a10 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
14a20 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
14a30 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 54 68  *pOuterNC  /* Th
14a40 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63 6f 6e  e outer name con
14a50 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e 55 4c  text. May be NUL
14a60 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  L. */.){.  ExprL
14a70 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
14a80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
14a90 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  set. */.  int i;
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f 6f 70       /* For-loop
14ac0 20 76 61 72 69 61 62 6c 65 20 75 73 65 64 20 69   variable used i
14ad0 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
14ae0 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  s */.  NameConte
14af0 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
14b00 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d 65 2d    /* Local name-
14b10 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
14b20 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
14b30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 67          /* The g
14b40 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
14b50 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
14b60 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75 6e 20  routine has run 
14b70 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 20 69  before, return i
14b80 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  mmediately. */. 
14b90 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f 6c 76   if( p->isResolv
14ba0 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
14bb0 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b 0a 20  ( !pOuterNC );. 
14bc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14bd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 73  _OK;.  }.  p->is
14be0 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a 0a 20  Resolved = 1;.. 
14bf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 76   /* If there hav
14c00 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
14c10 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68 69 6e  rrors, do nothin
14c20 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  g. */.  if( pPar
14c30 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
14c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14c50 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
14c60 20 50 72 65 70 61 72 65 20 74 68 65 20 73 65 6c   Prepare the sel
14c70 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ect statement. T
14c80 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 61 6c  his call will al
14c90 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  locate all curso
14ca0 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  rs.  ** required
14cb0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 74   to handle the t
14cc0 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71 75 65  ables and subque
14cd0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
14ce0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
14cf0 69 66 28 20 70 72 65 70 53 65 6c 65 63 74 53 74  if( prepSelectSt
14d00 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  mt(pParse, p) ){
14d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14d20 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
14d30 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
14d40 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
14d50 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
14d60 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65  SET clauses. The
14d70 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  se.  ** are not 
14d80 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
14d90 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
14da0 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
14db0 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 2a  NameContext..  *
14dc0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  /.  memset(&sNC,
14dd0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
14de0 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
14df0 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 73   pParse;.  if( s
14e00 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14e10 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
14e20 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20  pLimit) ||.     
14e30 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
14e40 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
14e50 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
14e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14e70 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
14e80 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61   Set up the loca
14e90 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74  l name-context t
14ea0 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72 52 65  o pass to ExprRe
14eb0 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74 6f 0a  solveNames() to.
14ec0 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
14ed0 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
14ee0 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61 6c 6c  ..  */.  sNC.all
14ef0 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73 4e 43  owAgg = 1;.  sNC
14f00 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
14f10 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Src;.  sNC.pNext
14f20 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a 20 20   = pOuterNC;..  
14f30 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
14f40 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
14f50 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20  et. */.  pEList 
14f60 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
14f70 66 28 20 21 70 45 4c 69 73 74 20 29 20 72 65 74  f( !pEList ) ret
14f80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
14f90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
14fa0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
14fb0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 58  +){.    Expr *pX
14fc0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
14fd0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73  pExpr;.    if( s
14fe0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
14ff0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58 29  eNames(&sNC, pX)
15000 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15010 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15030 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
15040 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
15050 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
15060 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
15070 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78 70 72  UP BY .  ** expr
15080 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61  ession, do not a
15090 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20  llow aggregates 
150a0 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74  in any of the ot
150b0 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  her expressions.
150c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
150d0 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20 20 70  !p->isAgg );.  p
150e0 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
150f0 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70 47 72  oupBy;.  if( pGr
15100 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68 61 73  oupBy || sNC.has
15110 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e 69 73  Agg ){.    p->is
15120 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Agg = 1;.  }else
15130 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41  {.    sNC.allowA
15140 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  gg = 0;.  }..  /
15150 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
15160 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
15170 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
15180 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
15190 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
151a0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
151b0 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
151c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
151d0 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
151e0 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
151f0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
15200 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72 65 74  AVING");.    ret
15210 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
15220 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
15230 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
15240 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
15250 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
15260 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  arsing the.  ** 
15270 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
15280 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
15290 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
152a0 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20  is so that.  ** 
152b0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
152c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
152d0 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
152e0 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
152f0 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  by.  ** aliases 
15300 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
15310 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 69 6e  t..  **.  ** Min
15320 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
15330 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15340 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
15350 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
15360 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72  re-evaluated for
15370 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20   each reference 
15380 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e  to it..  */.  sN
15390 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
153a0 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  List;.  if( sqli
153b0 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
153c0 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
153d0 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 20 73 71  ere) ||.      sq
153e0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
153f0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
15400 48 61 76 69 6e 67 29 20 7c 7c 0a 20 20 20 20 20  Having) ||.     
15410 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
15420 75 70 42 79 28 26 73 4e 43 2c 20 70 2d 3e 70 4f  upBy(&sNC, p->pO
15430 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
15440 20 7c 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73   ||.      proces
15450 73 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  sOrderGroupBy(&s
15460 4e 43 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47  NC, pGroupBy, "G
15470 52 4f 55 50 22 29 0a 20 20 29 7b 0a 20 20 20 20  ROUP").  ){.    
15480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15490 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ROR;.  }..  /* M
154a0 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52 4f  ake sure the GRO
154b0 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  UP BY clause doe
154c0 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67  s not contain ag
154d0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
154e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 47  s..  */.  if( pG
154f0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 74  roupBy ){.    st
15500 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
15510 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20  em *pItem;.  .  
15520 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
15530 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c  =pGroupBy->a; i<
15540 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
15550 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
15560 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
15570 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d  sProperty(pItem-
15580 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20  >pExpr, EP_Agg) 
15590 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
155a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
155b0 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75  e, "aggregate fu
155c0 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  nctions are not 
155d0 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20  allowed in ".   
155e0 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52           "the GR
155f0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b  OUP BY clause");
15600 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15610 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15630 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
15640 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20 61   one SELECT of a
15650 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73 75   compound, be su
15660 72 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e 61  re to resolve na
15670 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  mes.  ** in the 
15680 6f 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a 20  other SELECTs.. 
15690 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
156a0 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ior ){.    retur
156b0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52  n sqlite3SelectR
156c0 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20 70  esolve(pParse, p
156d0 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65 72  ->pPrior, pOuter
156e0 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NC);.  }else{.  
156f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15700 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
15710 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
15720 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
15730 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
15740 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
15750 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
15760 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
15770 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
15780 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
15790 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
157a0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
157b0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69  is.** routine si
157c0 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c  mply stores NULL
157d0 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
157e0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a  e memory cells..
157f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
15800 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
15810 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
15820 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
15830 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15840 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
15850 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15860 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
15870 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49  unc;.  if( pAggI
15880 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49  nfo->nFunc+pAggI
15890 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20  nfo->nColumn==0 
158a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
158b0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
158c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
158d0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
158e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
158f0 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c 20 70 41 67   OP_MemNull, pAg
15900 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
15910 4d 65 6d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  Mem, 0);.  }.  f
15920 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
15930 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
15940 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
15950 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
15960 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15970 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e  AddOp(v, OP_MemN
15980 75 6c 6c 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  ull, pFunc->iMem
15990 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 46  , 0);.    if( pF
159a0 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
159b0 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
159c0 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
159d0 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
159e0 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  ->pList==0 || pE
159f0 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
15a00 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
15a10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15a20 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69  rse, "DISTINCT i
15a30 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74  n aggregate must
15a40 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20   be followed ". 
15a50 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e            "by an
15a60 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20   expression");. 
15a70 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
15a80 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
15a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15aa0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
15ab0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
15ac0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
15ad0 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20  e, pE->pList);. 
15ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15af0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
15b00 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
15b10 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
15b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b30 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15b40 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)pKeyInfo, P3_K
15b50 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
15b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15b70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
15b80 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
15b90 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
15ba0 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
15bb0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
15bc0 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
15bd0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
15be0 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
15bf0 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
15c00 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
15c10 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
15c20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15c30 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
15c40 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
15c50 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
15c60 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
15c70 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
15c80 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
15c90 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
15ca0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
15cb0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
15cc0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
15cd0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 46  beOp3(v, OP_AggF
15ce0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
15cf0 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
15d00 45 78 70 72 20 3a 20 30 2c 0a 20 20 20 20 20 20  Expr : 0,.      
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
15d30 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P3_FUNCDEF);. 
15d40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
15d50 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
15d60 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
15d70 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
15d80 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
15d90 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
15da0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
15db0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
15dc0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
15dd0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
15de0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
15df0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
15e00 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
15e10 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
15e20 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
15e30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
15e40 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
15e50 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
15e60 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
15e70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
15e80 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
15e90 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
15ea0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
15eb0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
15ec0 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72 4c 69   = 0;.    ExprLi
15ed0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
15ee0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
15ef0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
15f00 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
15f10 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
15f20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
15f30 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
15f40 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  pList);.    }els
15f50 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
15f60 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
15f70 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d   pF->iDistinct>=
15f80 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e  0 ){.      addrN
15f90 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
15fa0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
15fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
15fc0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f  g==1 );.      co
15fd0 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20 70 46  deDistinct(v, pF
15fe0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
15ff0 72 4e 65 78 74 2c 20 31 29 3b 0a 20 20 20 20 7d  rNext, 1);.    }
16000 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
16010 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  nc->needCollSeq 
16020 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
16030 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
16040 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
16050 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
16060 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
16070 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
16080 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
16090 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
160a0 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 69 73  ->needCollSeq is
160b0 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20 20 66   true */.      f
160c0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
160d0 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
160e0 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
160f0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
16100 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
16110 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
16120 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
16130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16140 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
16150 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
16160 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
16170 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
16180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
16190 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p3(v, OP_CollSeq
161a0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
161b0 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45  pColl, P3_COLLSE
161c0 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
161d0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
161e0 4f 50 5f 41 67 67 53 74 65 70 2c 20 70 46 2d 3e  OP_AggStep, pF->
161f0 69 4d 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f 69  iMem, nArg, (voi
16200 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 33  d*)pF->pFunc, P3
16210 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 69  _FUNCDEF);.    i
16220 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
16230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16240 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
16250 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 7d  addrNext);.    }
16260 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20  .  }.  for(i=0, 
16270 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
16280 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
16290 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
162a0 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
162b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
162c0 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 29 3b  rse, pC->pExpr);
162d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
162e0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
162f0 74 6f 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c 20  tore, pC->iMem, 
16300 31 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  1);.  }.  pAggIn
16310 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
16320 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65   0;.}.../*.** Ge
16330 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
16340 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43 54  the given SELECT
16350 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
16360 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
16370 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
16380 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
16390 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
163a0 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73 74  * value of eDest
163b0 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a   and iParm..**.*
163c0 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c 75  *     eDest Valu
163d0 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a 2a  e       Result.*
163e0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
163f0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
16400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61 6c  -.**     SRT_Cal
16430 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65 20  lback    Invoke 
16440 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  the callback for
16450 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
16460 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 20   result..**.**  
16470 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
16480 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20 72     Store first r
16490 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79 20  esult in memory 
164a0 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a  cell iParm.**.**
164b0 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20       SRT_Set    
164c0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
164d0 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74 61  ts as keys of ta
164e0 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ble iParm..**.**
164f0 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
16500 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
16510 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
16520 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16530 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20   iParm.**.**    
16540 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
16550 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
16560 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
16570 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
16580 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
16590 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
165a0 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
165b0 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
165c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
165d0 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d 70   above is incomp
165e0 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e 61  lete.  Additiona
165f0 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20 68 61  l eDist value ha
16600 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20 73  ve be added.** s
16610 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65 6e  ince this commen
16620 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20 20  t was written.  
16630 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49 6e  See the selectIn
16640 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74 69  nerLoop() functi
16650 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d 70  on for.** a comp
16660 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66 20  lete listing of 
16670 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  the allowed valu
16680 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64 20  es of eDest and 
16690 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e 0a  their meanings..
166a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
166b0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
166c0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
166d0 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20    If any errors 
166e0 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  are.** encounter
166f0 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72  ed, then an appr
16700 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
16710 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
16720 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72  .** pParse->zErr
16730 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Msg..**.** This 
16740 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54  routine does NOT
16750 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74   free the Select
16760 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
16770 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61  d in.  The.** ca
16780 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  lling function n
16790 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e  eeds to do that.
167a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
167b0 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 61  nt, parentTab, a
167c0 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20 66  nd *pParentAgg f
167d0 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65 64  ields are filled
167e0 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 53   in if this.** S
167f0 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71 75  ELECT is a subqu
16800 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ery.  This routi
16810 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63 6f  ne may try to co
16820 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45 43  mbine this SELEC
16830 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70 61  T.** with its pa
16840 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20 73  rent to form a s
16850 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72 79  ingle flat query
16860 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c 20  .  In so doing, 
16870 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61 6e  it might.** chan
16880 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  ge the parent qu
16890 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 61  ery from a non-a
168a0 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20 61  ggregate to an a
168b0 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a  ggregate query..
168c0 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61 73  ** For that reas
168d0 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74 41  on, the pParentA
168e0 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73 65  gg flag is passe
168f0 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c 20  d as a pointer, 
16900 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20  so it.** can be 
16910 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
16920 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65 20  xample 1:   The 
16930 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  meaning of the p
16940 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
16950 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
16960 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49 4e  T * FROM t1 JOIN
16970 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e   (SELECT x, coun
16980 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a 4f  t(*) FROM t2) JO
16990 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20 20  IN t3;.**    \  
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75 62      \_______ sub
169c0 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20 20  query _______/  
169d0 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 5c        /.**     \
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20        /.**      
16a20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
16a30 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
16a40 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
16a50 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68 69  _____/.**.** Thi
16a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16a70 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74 65  led for the oute
16a80 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20 20  r query first.  
16a90 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c 0a   For that call,.
16aa0 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c 20  ** pParent will 
16ab0 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e 67  be NULL.  During
16ac0 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
16ad0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
16ae0 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f 75  ry, this .** rou
16af0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 72  tine is called r
16b00 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68 61  ecursively to ha
16b10 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65 72  ndle the subquer
16b20 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63 75  y.  For the recu
16b30 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20 70  rsive.** call, p
16b40 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69 6e  Parent will poin
16b50 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  t to the outer q
16b60 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20 74  uery.  Because t
16b70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 2a  he subquery is.*
16b80 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65  * the second ele
16b90 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65 2d  ment in a three-
16ba0 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70 61  way join, the pa
16bb0 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74 65  rentTab paramete
16bc0 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20 28  r will.** be 1 (
16bd0 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f 66  the 2nd value of
16be0 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72 72   a 0-indexed arr
16bf0 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ay.).*/.int sqli
16c00 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
16c10 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16c20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
16c30 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
16c40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
16c50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
16c60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
16c70 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
16c80 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
16c90 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
16ca0 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20   dispose of the 
16cb0 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
16cc0 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20 20   iParm,         
16cd0 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65 74      /* A paramet
16ce0 65 72 20 75 73 65 64 20 62 79 20 74 68 65 20 65  er used by the e
16cf0 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d 65  Dest disposal me
16d00 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  thod */.  Select
16d10 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
16d20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
16d30 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  CT for which thi
16d40 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79  s is a sub-query
16d50 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74   */.  int parent
16d60 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab,         /* 
16d70 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74  Index in pParent
16d80 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71  ->pSrc of this q
16d90 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  uery */.  int *p
16da0 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20 20  ParentAgg,      
16db0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
16dc0 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61  ent uses aggrega
16dd0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
16de0 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20 20    char *aff     
16df0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 65           /* If e
16e00 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69 6f  Dest is SRT_Unio
16e10 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  n, the affinity 
16e20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69  string */.){.  i
16e30 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
16e40 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
16e50 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
16e60 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
16e70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
16e80 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
16e90 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
16ea0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
16eb0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
16ec0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
16ed0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
16ee0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
16ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16f00 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
16f10 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
16f20 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16f30 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
16f40 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
16f50 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
16f60 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
16f70 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
16f80 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
16f90 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
16fa0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
16fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
16fc0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
16fd0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
16fe0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
16ff0 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
17000 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
17010 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
17020 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
17030 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
17040 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
17050 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
17060 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
17070 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
17080 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
17090 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
170a0 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
170b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
170c0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
170d0 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
170e0 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
170f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
17100 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
17110 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
17120 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
17130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
17140 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
17150 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
17160 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
17170 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
17180 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
17190 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
171a0 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
171b0 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
171c0 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
171d0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
171e0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
171f0 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17210 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
17220 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
17230 2a 2f 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  */..  if( p==0 |
17240 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  | sqlite3MallocF
17250 61 69 6c 65 64 28 29 20 7c 7c 20 70 50 61 72 73  ailed() || pPars
17260 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
17270 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
17280 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
17290 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
172a0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
172b0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
172c0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
172d0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
172e0 67 67 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64  ggInfo));..#ifnd
172f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
17300 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
17310 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
17320 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
17330 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
17340 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
17350 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
17360 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
17370 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
17380 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
17390 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20  Select *pLoop;. 
173a0 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
173b0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
173c0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
173d0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
173e0 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
173f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17400 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
17410 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44  ct(pParse, p, eD
17420 65 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29  est, iParm, aff)
17430 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17440 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
17450 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67  rderBy;.  if( Ig
17460 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65  norableOrderby(e
17470 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  Dest) ){.    p->
17480 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
17490 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  }.  if( sqlite3S
174a0 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61  electResolve(pPa
174b0 72 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20  rse, p, 0) ){.  
174c0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
174d0 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64  d;.  }.  p->pOrd
174e0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
174f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61  ..  /* Make loca
17500 6c 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  l copies of the 
17510 70 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74  parameters for t
17520 68 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  his query..  */.
17530 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
17540 70 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d  pSrc;.  pWhere =
17550 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
17560 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
17570 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
17580 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
17590 69 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67  isAgg = p->isAgg
175a0 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d  ;.  isDistinct =
175b0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
175c0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
175d0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69  List;.  if( pELi
175e0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  st==0 ) goto sel
175f0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a  ect_end;..  /* .
17600 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e    ** Do not even
17610 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65   attempt to gene
17620 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66  rate any code if
17630 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79   we have already
17640 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72   seen.  ** error
17650 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  s before this ro
17660 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20  utine starts..  
17670 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
17680 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73  >nErr>0 ) goto s
17690 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
176a0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
176b0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
176c0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
176d0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
176e0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
176f0 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
17700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
17710 55 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73  UERY.  if( (eDes
17720 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
17730 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26  est==SRT_Set) &&
17740 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31   pEList->nExpr>1
17750 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
17760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17770 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
17780 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
17790 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
177a0 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
177b0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
177c0 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73  on");.    goto s
177d0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
177e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45  endif..  /* ORDE
177f0 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20  R BY is ignored 
17800 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61  for some destina
17810 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
17820 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
17830 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20  by(eDest) ){.   
17840 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
17850 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67   }..  /* Begin g
17860 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
17870 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
17880 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
17890 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
178a0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
178b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
178c0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
178d0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
178e0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
178f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
17900 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17910 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
17920 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
17930 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ).  for(i=0; i<p
17940 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
17950 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
17960 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
17970 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ontext = 0;.    
17980 69 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43  int needRestoreC
17990 6f 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75  ontext;.    stru
179a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
179b0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
179c0 73 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69  st->a[i];..    i
179d0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
179e0 74 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69  t==0 || pItem->i
179f0 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e  sPopulated ) con
17a00 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
17a10 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  Item->zName!=0 )
17a20 7b 0a 20 20 20 20 20 20 7a 53 61 76 65 64 41 75  {.      zSavedAu
17a30 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
17a40 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
17a50 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
17a60 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
17a70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
17a80 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f     needRestoreCo
17a90 6e 74 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 7d  ntext = 1;.    }
17aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 65 65 64  else{.      need
17ab0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
17ac0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
17ad0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17ae0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
17af0 63 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ct, SRT_EphemTab
17b00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17b10 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
17b20 6f 72 2c 20 70 2c 20 69 2c 20 26 69 73 41 67 67  or, p, i, &isAgg
17b30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  , 0);.    if( ne
17b40 65 64 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74  edRestoreContext
17b50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
17b60 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
17b70 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
17b80 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  xt;.    }.    pT
17b90 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
17ba0 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70  ;.    pWhere = p
17bb0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 69 66  ->pWhere;.    if
17bc0 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
17bd0 72 62 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20  rby(eDest) ){.  
17be0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
17bf0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
17c00 7d 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  }.    pGroupBy =
17c10 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
17c20 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
17c30 48 61 76 69 6e 67 3b 0a 20 20 20 20 69 73 44 69  Having;.    isDi
17c40 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69  stinct = p->isDi
17c50 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 23 65 6e 64  stinct;.  }.#end
17c60 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  if..  /* Check f
17c70 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  or the special c
17c80 61 73 65 20 6f 66 20 61 20 6d 69 6e 28 29 20 6f  ase of a min() o
17c90 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e  r max() function
17ca0 20 62 79 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20   by itself.  ** 
17cb0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
17cc0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 69  t..  */.  if( si
17cd0 6d 70 6c 65 4d 69 6e 4d 61 78 51 75 65 72 79 28  mpleMinMaxQuery(
17ce0 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65 73 74  pParse, p, eDest
17cf0 2c 20 69 50 61 72 6d 29 20 29 7b 0a 20 20 20 20  , iParm) ){.    
17d00 72 63 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  rc = 0;.    goto
17d10 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
17d20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
17d30 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20 61  see if this is a
17d40 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 63   subquery that c
17d50 61 6e 20 62 65 20 22 66 6c 61 74 74 65 6e 65 64  an be "flattened
17d60 22 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  " into its paren
17d70 74 2e 0a 20 20 2a 2a 20 49 66 20 66 6c 61 74 74  t..  ** If flatt
17d80 65 6e 69 6e 67 20 69 73 20 61 20 70 6f 73 73 69  ening is a possi
17d90 62 6c 69 74 79 2c 20 64 6f 20 73 6f 20 61 6e 64  blity, do so and
17da0 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
17db0 65 6c 79 2e 20 20 0a 20 20 2a 2f 0a 23 69 66 6e  ely.  .  */.#ifn
17dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17dd0 56 49 45 57 0a 20 20 69 66 28 20 70 50 61 72 65  VIEW.  if( pPare
17de0 6e 74 20 26 26 20 70 50 61 72 65 6e 74 41 67 67  nt && pParentAgg
17df0 20 26 26 0a 20 20 20 20 20 20 66 6c 61 74 74 65   &&.      flatte
17e00 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 65 6e  nSubquery(pParen
17e10 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20 2a 70  t, parentTab, *p
17e20 50 61 72 65 6e 74 41 67 67 2c 20 69 73 41 67 67  ParentAgg, isAgg
17e30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41  ) ){.    if( isA
17e40 67 67 20 29 20 2a 70 50 61 72 65 6e 74 41 67 67  gg ) *pParentAgg
17e50 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 73   = 1;.    goto s
17e60 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
17e70 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
17e80 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
17e90 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
17ea0 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
17eb0 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
17ec0 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
17ed0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
17ee0 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
17ef0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
17f00 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
17f10 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
17f20 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
17f30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
17f40 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
17f50 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
17f60 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
17f70 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
17f80 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
17f90 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
17fa0 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
17fb0 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
17fc0 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
17fd0 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
17fe0 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
17ff0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
18000 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
18010 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66  pKeyInfo;.    if
18020 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
18030 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
18040 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
18050 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
18060 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
18070 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
18080 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  By);.    pOrderB
18090 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  y->iECursor = pP
180a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
180b0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
180c0 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49  m[2] = addrSortI
180d0 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
180e0 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
180f0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18100 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
18110 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
18120 45 78 70 72 2b 32 2c 20 20 20 20 20 20 20 20 20  Expr+2,         
18130 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
18140 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f  r*)pKeyInfo, P3_
18150 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
18160 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18170 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
18180 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
18190 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
181a0 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
181b0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
181c0 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
181d0 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74 3d   */.  if( eDest=
181e0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
181f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18200 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
18210 45 70 68 65 6d 65 72 61 6c 2c 20 69 50 61 72 6d  Ephemeral, iParm
18220 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
18230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
18240 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
18250 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
18260 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18270 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
18280 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
18290 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20  se, p, iEnd);.. 
182a0 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
182b0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
182c0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
182d0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
182e0 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20   isDistinct ){. 
182f0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
18300 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e  Info;.    distin
18310 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
18320 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  b++;.    pKeyInf
18330 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
18340 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
18350 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
18360 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
18370 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
18380 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
18390 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
183a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
183b0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45  )pKeyInfo, P3_KE
183c0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
183d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73    }else{.    dis
183e0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tinct = -1;.  }.
183f0 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20  .  /* Aggregate 
18400 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  and non-aggregat
18410 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61  e queries are ha
18420 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
18430 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67  y */.  if( !isAg
18440 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
18450 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
18460 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d  case is for non-
18470 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
18480 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74  s.    ** Begin t
18490 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
184a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e  .    */.    pWIn
184b0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
184c0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
184d0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
184e0 20 26 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20   &pOrderBy);.   
184f0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
18500 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18510 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  ;..    /* If sor
18520 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
18530 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
18540 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
18550 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
18560 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
18570 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
18580 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
18590 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
185a0 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
185b0 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
185c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61      */.    if( a
185d0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
185e0 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  && pOrderBy==0 )
185f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18600 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
18610 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  v, addrSortIndex
18620 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  , 1);.      p->a
18630 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
18640 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
18650 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
18660 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20  ard inner loop. 
18670 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 65     */.    if( se
18680 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
18690 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
186a0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
186b0 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74   distinct, eDest
186c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
186d0 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70 57 49        iParm, pWI
186e0 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
186f0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
18700 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20 67  aff) ){.       g
18710 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
18720 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
18730 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
18740 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
18750 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
18760 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
18770 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
18780 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73  is is the proces
18790 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
187a0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
187b0 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
187c0 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
187d0 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
187e0 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
187f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
18800 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
18810 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
18820 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
18830 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
18840 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
18850 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
18860 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
18870 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
18880 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
18890 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
188a0 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
188b0 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
188c0 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
188d0 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
18900 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
18910 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
18920 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
18950 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
18960 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
18970 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
18980 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
18990 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
189a0 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
189b0 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
189c0 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
189d0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
189e0 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20 54  er */...    /* T
189f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
18a00 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64 72  iables hold addr
18a10 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73 20  esses or labels 
18a20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68 65  for parts of the
18a30 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
18a40 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d 20  machine program 
18a50 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20 74  we are putting t
18a60 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20 69  ogether */.    i
18a70 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
18a80 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  ;      /* Start 
18a90 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
18aa0 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
18ab0 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ult row */.    i
18ac0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
18ad0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68         /* Set th
18ae0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
18af0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 69   return */.    i
18b00 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a  nt addrInitializ
18b10 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74 20  eLoop; /* Start 
18b20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69  of code that ini
18b30 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e 70  tializes the inp
18b40 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ut loop */.    i
18b50 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  nt addrTopOfLoop
18b60 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66  ;      /* Top of
18b70 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
18b80 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47  */.    int addrG
18b90 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20 20 2f  roupByChange;  /
18ba0 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75 6e 73  * Code that runs
18bb0 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55 50 20   when any GROUP 
18bc0 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65 73 20  BY term changes 
18bd0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 50  */.    int addrP
18be0 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20 20 2f  rocessRow;     /
18bf0 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63 65 73  * Code to proces
18c00 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70 75 74  s a single input
18c10 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
18c20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
18c30 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 61 6c      /* End of al
18c40 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  l processing */.
18c50 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
18c60 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a 20 54  ingIdx;     /* T
18c70 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
18c80 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
18c90 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
18ca0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
18cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
18cc0 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
18cd0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
18ce0 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64  ator */..    add
18cf0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
18d00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18d10 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
18d20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
18d30 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
18d40 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
18d50 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
18d60 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
18d70 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
18d80 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
18d90 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
18da0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
18db0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
18dc0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
18dd0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
18de0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
18df0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
18e00 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
18e10 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
18e20 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
18e30 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
18e40 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
18e50 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
18e60 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
18e70 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
18e80 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
18e90 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  y;.    if( sqlit
18ea0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
18eb0 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
18ec0 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  t) ){.      goto
18ed0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
18ee0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
18ef0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
18f00 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65  List(&sNC, pOrde
18f10 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rBy) ){.      go
18f20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18f30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
18f40 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
18f50 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
18f60 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
18f70 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
18f80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
18f90 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
18fa0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
18fb0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
18fc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
18fd0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
18fe0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
18ff0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
19000 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
19010 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
19020 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  i].pExpr->pList)
19030 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
19040 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
19050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
19060 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
19070 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20  Failed() ) goto 
19080 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
19090 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
190a0 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
190b0 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
190c0 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
190d0 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
190e0 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 20 61  re complex tha a
190f0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
19100 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
19110 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
19120 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
19130 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
19140 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
19150 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
19160 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
19170 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72   */..      /* Cr
19180 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74  eate labels that
19190 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64   we will be need
191a0 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
191b0 20 20 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69    .      addrIni
191c0 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71  tializeLoop = sq
191d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
191e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  el(v);.      add
191f0 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d  rGroupByChange =
19200 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19210 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19220 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d  addrProcessRow =
19230 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19240 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20  Label(v);..     
19250 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
19260 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
19270 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
19280 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
19290 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
192a0 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
192b0 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
192c0 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
192d0 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
192e0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
192f0 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
19300 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e  er all, the Open
19310 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
19320 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
19330 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
19340 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
19350 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
19360 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
19370 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
19380 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
19390 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
193a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
193b0 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
193c0 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
193d0 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  x =.          sq
193e0 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
193f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
19400 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
19410 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20  ngIdx,.         
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
19440 67 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  gColumn,.       
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
19470 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P3_KEYINFO_HA
19480 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f  NDOFF);..      /
19490 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
194a0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
194b0 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
194c0 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
194d0 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
194e0 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 70 50     iUseFlag = pP
194f0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
19500 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
19510 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
19520 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
19530 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19540 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
19550 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
19560 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
19570 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
19580 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
19590 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
195a0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
195b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
195c0 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69   OP_MemInt, 0, i
195d0 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
195e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
195f0 2c 20 22 23 20 63 6c 65 61 72 20 61 62 6f 72 74  , "# clear abort
19600 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
19610 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19620 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30  (v, OP_MemInt, 0
19630 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
19640 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19650 76 2c 20 22 23 20 69 6e 64 69 63 61 74 65 20 61  v, "# indicate a
19660 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
19670 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
19680 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
19690 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 49  P_Goto, 0, addrI
196a0 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a  nitializeLoop);.
196b0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
196c0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
196d0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
196e0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
196f0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
19700 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
19710 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
19720 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
19730 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
19740 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
19750 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
19760 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
19770 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
19780 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
19790 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
197a0 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
197b0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
197c0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
197d0 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
197e0 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
197f0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
19800 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19810 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
19820 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
19830 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
19840 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
19850 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
19860 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19870 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
19880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19890 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
198a0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
198b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
198c0 6e 74 28 28 76 2c 20 22 23 20 73 65 74 20 61 62  nt((v, "# set ab
198d0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
198e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
198f0 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  dOp(v, OP_Return
19900 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  , 0, 0);.      a
19910 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
19920 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19930 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
19940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19950 28 76 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c  (v, OP_IfMemPos,
19960 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
19970 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
19980 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19990 76 2c 20 22 23 20 47 72 6f 75 70 62 79 20 72 65  v, "# Groupby re
199a0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
199b0 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
199c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
199d0 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75  AddOp(v, OP_Retu
199e0 72 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rn, 0, 0);.     
199f0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
19a00 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
19a10 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
19a20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
19a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19a40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
19a50 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
19a60 75 74 70 75 74 52 6f 77 2b 31 2c 20 31 29 3b 0a  utputRow+1, 1);.
19a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
19a80 20 3d 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f   = selectInnerLo
19a90 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
19aa0 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
19ab0 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 20 20 20 20 64 69 73 74 69 6e 63 74 2c 20 65 44      distinct, eD
19ae0 65 73 74 2c 20 69 50 61 72 6d 2c 20 0a 20 20 20  est, iParm, .   
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
19b10 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
19b20 41 62 6f 72 74 2c 20 61 66 66 29 3b 0a 20 20 20  Abort, aff);.   
19b30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19b40 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
19b50 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
19b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19b70 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
19b80 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
19b90 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19ba0 22 23 20 65 6e 64 20 67 72 6f 75 70 62 79 20 72  "# end groupby r
19bb0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
19bc0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
19bd0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19be0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
19bf0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
19c00 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
19c10 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
19c20 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
19c30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
19c40 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
19c50 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
19c60 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
19c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19c80 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 74 75 72  ddOp(v, OP_Retur
19c90 6e 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 20  n, 0, 0);..     
19ca0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
19cb0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
19cc0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
19cd0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
19ce0 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
19cf0 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
19d00 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
19d10 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
19d20 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
19d30 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
19d40 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
19d50 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
19d60 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
19d70 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
19d80 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
19d90 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
19da0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
19db0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
19dc0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19dd0 65 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61  el(v, addrInitia
19de0 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  lizeLoop);.     
19df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19e00 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
19e10 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
19e20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
19e30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
19e40 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
19e50 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
19e60 42 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  By);.      if( p
19e70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
19e80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
19e90 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 3d 3d    if( pGroupBy==
19ea0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
19eb0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
19ec0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
19ed0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
19ee0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
19ef0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
19f00 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
19f10 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
19f20 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
19f30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
19f40 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
19f50 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
19f60 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
19f70 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
19f80 2f 0a 20 20 20 20 20 20 20 20 70 47 72 6f 75 70  /.        pGroup
19f90 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
19fa0 3b 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ;.        groupB
19fb0 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
19fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19fd0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
19fe0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
19ff0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
1a000 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
1a010 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
1a020 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
1a030 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
1a040 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
1a050 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
1a060 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
1a070 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
1a080 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
1a090 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
1a0a0 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
1a0b0 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
1a0c0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
1a0d0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
1a0e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a0f0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1a100 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20   pGroupBy);.    
1a110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a120 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65  ddOp(v, OP_Seque
1a130 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  nce, sAggInfo.so
1a140 72 74 69 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20  rtingIdx, 0);.  
1a150 20 20 20 20 20 20 6a 20 3d 20 70 47 72 6f 75 70        j = pGroup
1a160 42 79 2d 3e 6e 45 78 70 72 2b 31 3b 0a 20 20 20  By->nExpr+1;.   
1a170 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1a180 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
1a190 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a1a0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1a1b0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
1a1c0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
1a1d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1a1e0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
1a1f0 6e 3c 6a 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<j ) continue;.
1a200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1a210 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  ol->iColumn<0 ){
1a220 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1a230 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1a240 20 4f 50 5f 52 6f 77 69 64 2c 20 70 43 6f 6c 2d   OP_Rowid, pCol-
1a250 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
1a260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1a270 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
1a280 2a 70 54 61 62 20 3d 20 70 43 6f 6c 2d 3e 70 54  *pTab = pCol->pT
1a290 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
1a2a0 69 6e 74 20 6f 70 20 3d 20 28 70 54 61 62 20 26  int op = (pTab &
1a2b0 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  & IsVirtual(pTab
1a2c0 29 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  )) ? OP_VColumn 
1a2d0 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
1a2e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a2f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
1a300 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 70   pCol->iTable, p
1a310 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  Col->iColumn);. 
1a320 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a330 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
1a340 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1a350 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a360 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6a  OP_MakeRecord, j
1a370 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1a380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a390 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1a3a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
1a3b0 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Idx, 0);.       
1a3c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1a3d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1a3e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a3f0 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73  Op(v, OP_Sort, s
1a400 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1a410 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
1a420 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1a430 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50 20 42  t((v, "# GROUP B
1a440 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
1a450 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
1a460 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
1a470 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1a480 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
1a490 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
1a4a0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
1a4b0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
1a4c0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
1a4d0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
1a4e0 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
1a4f0 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
1a500 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
1a510 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
1a520 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1a530 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
1a540 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
1a550 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
1a560 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
1a570 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1a580 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
1a590 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
1a5a0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
1a5b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a5c0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
1a5d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47     for(j=0; j<pG
1a5e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a  roupBy->nExpr; j
1a5f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1a600 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
1a610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a620 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1a630 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66  _Column, sAggInf
1a640 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 29  o.sortingIdx, j)
1a650 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1a660 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
1a670 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
1a680 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
1a690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1a6a0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
1a6b0 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[j].pExpr);.   
1a6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1a6d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a6e0 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
1a6f0 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72 6f 75  iBMem+j, j<pGrou
1a700 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  pBy->nExpr-1);. 
1a710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1a720 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (j=pGroupBy->nEx
1a730 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  pr-1; j>=0; j--)
1a740 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  {.        if( j<
1a750 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
1a760 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
1a770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
1a780 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69  v, OP_MemLoad, i
1a790 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20  BMem+j, 0);.    
1a7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1a7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a7c0 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 69 41  , OP_MemLoad, iA
1a7d0 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20 20 20  Mem+j, 0);.     
1a7e0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b 0a 20     if( j==0 ){. 
1a7f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a800 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1a810 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64 72 50  Eq, 0x200, addrP
1a820 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20 20 20  rocessRow);.    
1a830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a850 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20  AddOp(v, OP_Ne, 
1a860 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f 75 70  0x200, addrGroup
1a870 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  ByChange);.     
1a880 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1a890 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
1a8a0 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a 29 70  (v, -1, (void*)p
1a8b0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
1a8c0 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  ], P3_COLLSEQ);.
1a8d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1a8e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a8f0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
1a900 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
1a910 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
1a920 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68 65 20  * Change in the 
1a930 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
1a940 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
1a950 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
1a960 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
1a970 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
1a980 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
1a990 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
1a9a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1a9b0 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
1a9c0 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
1a9d0 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
1a9e0 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
1a9f0 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
1aa00 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
1aa10 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
1aa20 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1aa30 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
1aa40 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1aa50 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
1aa60 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
1aa70 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
1aa80 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
1aa90 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
1aaa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1aab0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1aac0 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 29  drGroupByChange)
1aad0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
1aae0 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
1aaf0 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
1ab00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ab10 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f 76 65  Op(v, OP_MemMove
1ab20 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d 65 6d  , iAMem+j, iBMem
1ab30 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +j);.      }.   
1ab40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ab50 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1ab60 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f   0, addrOutputRo
1ab70 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
1ab80 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f 75 74  mment((v, "# out
1ab90 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
1aba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1abb0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d  eAddOp(v, OP_IfM
1abc0 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  emPos, iAbortFla
1abd0 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
1abe0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1abf0 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62 6f 72  v, "# check abor
1ac00 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
1ac10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ac20 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30  p(v, OP_Gosub, 0
1ac30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
1ac40 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1ac50 28 76 2c 20 22 23 20 72 65 73 65 74 20 61 63 63  (v, "# reset acc
1ac60 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
1ac70 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1ac80 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1ac90 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
1aca0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
1acb0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
1acc0 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
1acd0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1ace0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1acf0 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73 73 52  (v, addrProcessR
1ad00 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  ow);.      updat
1ad10 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
1ad20 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
1ad30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ad40 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1ad50 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46 6c 61  mInt, 1, iUseFla
1ad60 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
1ad70 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 64  mment((v, "# ind
1ad80 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
1ad90 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
1ada0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
1adb0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
1adc0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
1add0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
1ade0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1adf0 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  Op(v, OP_Next, s
1ae00 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1ae10 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
1ae20 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
1ae30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ae40 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
1ae50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ae60 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
1ae70 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
1ae80 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Idx, 1);.      }
1ae90 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
1aea0 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
1aeb0 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
1aec0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1aed0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1aee0 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f 75  Gosub, 0, addrOu
1aef0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
1af00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1af10 22 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  "# output final 
1af20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20  row"));.      . 
1af30 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
1af40 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c  roupBy */.    el
1af50 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  se {.      /* Th
1af60 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
1af70 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
1af80 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
1af90 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
1afa0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
1afb0 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
1afc0 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
1afd0 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
1afe0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
1aff0 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
1b000 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
1b010 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1b020 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57  gInfo);.      pW
1b030 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1b040 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1b050 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1b060 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
1b070 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1b080 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1b090 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
1b0a0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
1b0b0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
1b0c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1b0d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66  pWInfo);.      f
1b0e0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
1b0f0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
1b100 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f  gInfo);.      pO
1b110 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1b120 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b    if( pHaving ){
1b130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b140 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1b150 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
1b160 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  rEnd, 1);.      
1b170 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  }.      selectIn
1b180 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1b190 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
1b1a0 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20   0, 0, -1, .    
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 20 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c 20    eDest, iParm, 
1b1d0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
1b1e0 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20 20  , aff);.    }.  
1b1f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b200 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
1b210 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
1b220 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
1b230 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
1b240 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1b250 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b260 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
1b270 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
1b280 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
1b290 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
1b2a0 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
1b2b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
1b2c0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
1b2d0 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
1b2e0 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
1b2f0 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73 74  st->nExpr, eDest
1b300 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a 23  , iParm);.  }..#
1b310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b320 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f 2a  IT_SUBQUERY.  /*
1b330 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20 73   If this was a s
1b340 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76 65  ubquery, we have
1b350 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20 74   now converted t
1b360 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1b370 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72   a.  ** temporar
1b380 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 73 65 74  y table.  So set
1b390 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65   the SrcList_ite
1b3a0 6d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 66 6c  m.isPopulated fl
1b3b0 61 67 20 74 6f 20 70 72 65 76 65 6e 74 0a 20 20  ag to prevent.  
1b3c0 2a 2a 20 74 68 69 73 20 73 75 62 71 75 65 72 79  ** this subquery
1b3d0 20 66 72 6f 6d 20 62 65 69 6e 67 20 65 76 61 6c   from being eval
1b3e0 75 61 74 65 64 20 61 67 61 69 6e 20 61 6e 64 20  uated again and 
1b3f0 74 6f 20 66 6f 72 63 65 20 74 68 65 20 75 73 65  to force the use
1b400 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d   of.  ** the tem
1b410 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 20 20  porary table..  
1b420 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
1b430 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b440 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e  pParent->pSrc->n
1b450 53 72 63 3e 70 61 72 65 6e 74 54 61 62 20 29 3b  Src>parentTab );
1b460 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b470 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61  rent->pSrc->a[pa
1b480 72 65 6e 74 54 61 62 5d 2e 70 53 65 6c 65 63 74  rentTab].pSelect
1b490 3d 3d 70 20 29 3b 0a 20 20 20 20 70 50 61 72 65  ==p );.    pPare
1b4a0 6e 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65  nt->pSrc->a[pare
1b4b0 6e 74 54 61 62 5d 2e 69 73 50 6f 70 75 6c 61 74  ntTab].isPopulat
1b4c0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  ed = 1;.  }.#end
1b4d0 69 66 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  if..  /* Jump he
1b4e0 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
1b4f0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1b500 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b510 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
1b520 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1b530 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1b540 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
1b550 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
1b560 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
1b570 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
1b580 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
1b590 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
1b5a0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
1b5b0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1b5c0 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
1b5d0 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
1b5e0 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
1b5f0 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
1b600 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a  elect_end:..  /*
1b610 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
1b620 20 6e 61 6d 65 73 20 69 66 20 77 65 20 77 69 6c   names if we wil
1b630 6c 20 62 65 20 75 73 69 6e 67 20 74 68 65 6d 20  l be using them 
1b640 69 6e 20 61 20 63 61 6c 6c 62 61 63 6b 2e 20 20  in a callback.  
1b650 54 68 69 73 0a 20 20 2a 2a 20 73 74 65 70 20 69  This.  ** step i
1b660 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  s skipped if the
1b670 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69 6e 67   output is going
1b680 20 74 6f 20 73 6f 6d 65 20 6f 74 68 65 72 20 64   to some other d
1b690 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f  estination..  */
1b6a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b6b0 45 5f 4f 4b 20 26 26 20 65 44 65 73 74 3d 3d 53  E_OK && eDest==S
1b6c0 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  RT_Callback ){. 
1b6d0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
1b6e0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1b6f0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
1b700 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 46  ;.  }..  sqliteF
1b710 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61 43 6f  ree(sAggInfo.aCo
1b720 6c 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  l);.  sqliteFree
1b730 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29  (sAggInfo.aFunc)
1b740 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b750 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1b760 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
1b770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1b780 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  UG)./*.*********
1b790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b7d0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
1b7e0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20  llowing code is 
1b7f0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
1b800 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
1b810 6e 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a  nly.  The code.*
1b820 2a 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64  * that follows d
1b830 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
1b840 6e 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e  n normal builds.
1b850 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1b860 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
1b870 6f 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20  o print out the 
1b880 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f  content of all o
1b890 72 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20  r part of a .** 
1b8a0 70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73  parse structures
1b8b0 20 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20   such as Select 
1b8c0 6f 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70  or Expr.  Such p
1b8d0 72 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65  rintouts are use
1b8e0 66 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69  ful.** for helpi
1b8f0 6e 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64  ng to understand
1b900 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69   what is happeni
1b910 6e 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f  ng inside the co
1b920 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
1b930 64 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75  during the execu
1b940 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20  tion of complex 
1b950 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b960 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  s..**.** These r
1b970 6f 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63  outine are not c
1b980 61 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66  alled anywhere f
1b990 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e  rom within the n
1b9a0 6f 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61  ormal.** code ba
1b9b0 73 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e  se.  Then are in
1b9c0 74 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c  tended to be cal
1b9d0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
1b9e0 74 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  the debugger.** 
1b9f0 6f 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72  or from temporar
1ba00 79 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65  y "printf" state
1ba10 6d 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66  ments inserted f
1ba20 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f  or debugging..*/
1ba30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
1ba40 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b  ntExpr(Expr *p){
1ba50 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
1ba60 7a 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e  z && p->token.n>
1ba70 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1ba80 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e  DebugPrintf("(%.
1ba90 2a 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c  *s", p->token.n,
1baa0 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20   p->token.z);.  
1bab0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1bac0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
1bad0 25 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d  %d", p->op);.  }
1bae0 0a 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20  .  if( p->pLeft 
1baf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
1bb00 62 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a  bugPrintf(" ");.
1bb10 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
1bb20 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  Expr(p->pLeft);.
1bb30 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69    }.  if( p->pRi
1bb40 67 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ght ){.    sqlit
1bb50 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
1bb60 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1bb70 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67  rintExpr(p->pRig
1bb80 68 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ht);.  }.  sqlit
1bb90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29  e3DebugPrintf(")
1bba0 22 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  ");.}.void sqlit
1bbb0 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
1bbc0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
1bbd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1bbe0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1bbf0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1bc00 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
1bc10 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
1bc20 70 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pr);.    if( i<p
1bc30 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b  List->nExpr-1 ){
1bc40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1bc50 62 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b  bugPrintf(", ");
1bc60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
1bc70 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65  d sqlite3PrintSe
1bc80 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
1bc90 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73  int indent){.  s
1bca0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1bcb0 66 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29  f("%*sSELECT(%p)
1bcc0 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20   ", indent, "", 
1bcd0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69  p);.  sqlite3Pri
1bce0 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45  ntExprList(p->pE
1bcf0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1bd00 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
1bd10 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
1bd20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50   ){.    char *zP
1bd30 72 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69  refix;.    int i
1bd40 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20  ;.    zPrefix = 
1bd50 22 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28  "FROM";.    for(
1bd60 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
1bd70 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1bd80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1bd90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1bda0 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
1bdb0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
1bdc0 67 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20  gPrintf("%*s ", 
1bdd0 69 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69  indent+6, zPrefi
1bde0 78 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69  x);.      zPrefi
1bdf0 78 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66  x = "";.      if
1be00 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1be10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1be20 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1be30 28 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73  (\n");.        s
1be40 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63  qlite3PrintSelec
1be50 74 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  t(pItem->pSelect
1be60 2c 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20  , indent+10);.  
1be70 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
1be80 75 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c  ugPrintf("%*s)",
1be90 20 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a   indent+8, "");.
1bea0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1beb0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a  pItem->zName ){.
1bec0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1bed0 65 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c  ebugPrintf("%s",
1bee0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
1bef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bf00 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
1bf10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1bf20 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61  DebugPrintf("(ta
1bf30 62 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d  ble: %s)", pItem
1bf40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1bf50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bf60 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1bf70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bf80 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
1bf90 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  AS %s", pItem->z
1bfa0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
1bfb0 20 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70        if( i<p->p
1bfc0 53 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20  Src->nSrc-1 ){. 
1bfd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
1bfe0 62 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a  bugPrintf(",");.
1bff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c000 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1c010 28 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ("\n");.    }.  
1c020 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
1c030 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1c040 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73  DebugPrintf("%*s
1c050 20 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74   WHERE ", indent
1c060 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
1c070 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
1c080 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
1c090 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
1c0a0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
1c0b0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
1c0c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1c0d0 72 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50  rintf("%*s GROUP
1c0e0 20 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22   BY ", indent, "
1c0f0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1c100 72 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  rintExprList(p->
1c110 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1c120 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1c130 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
1c140 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
1c150 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1c160 67 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56  gPrintf("%*s HAV
1c170 49 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22  ING ", indent, "
1c180 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ");.    sqlite3P
1c190 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76  rintExpr(p->pHav
1c1a0 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
1c1b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
1c1c0 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
1c1d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1c1e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1c1f0 6e 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42  ntf("%*s ORDER B
1c200 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
1c210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
1c220 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f  ntExprList(p->pO
1c230 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
1c240 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1c250 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20  "\n");.  }.}./* 
1c260 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63  End of the struc
1c270 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74  ture debug print
1c280 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a  ing code.*******
1c290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c2d0 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f  ******/.#endif /
1c2e0 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
1c2f0 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65  _TEST) || define
1c300 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1c310 2a 2f 0a                                         */.