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

Artifact ace67e13cd1344aa8de552c8eab9bce58f97ec24:


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 30 32  select.c,v 1.302
0200: 20 32 30 30 36 2f 30 32 2f 31 30 20 30 32 3a 32   2006/02/10 02:2
0210: 37 3a 34 33 20 64 61 6e 69 65 6c 6b 31 39 37 37  7:43 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 56 69 72 74 5b 30 5d 20 3d 20 2d 31  OpenVirt[0] = -1
0920: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0930: 65 6e 56 69 72 74 5b 31 5d 20 3d 20 2d 31 3b 0a  enVirt[1] = -1;.
0940: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0950: 56 69 72 74 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20  Virt[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 73 74 61 74  of zName.*/.stat
1420: 69 63 20 45 78 70 72 20 2a 63 72 65 61 74 65 49  ic Expr *createI
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 63 72 65 61 74 65  .  pE1a = create
1740: 49 64 45 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20  IdExpr(zCol);.  
1750: 70 45 32 61 20 3d 20 63 72 65 61 74 65 49 64 45  pE2a = createIdE
1760: 78 70 72 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  xpr(zCol);.  if(
1770: 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20   zAlias1==0 ){. 
1780: 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61     zAlias1 = pTa
1790: 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  b1->zName;.  }. 
17a0: 20 70 45 31 62 20 3d 20 63 72 65 61 74 65 49 64   pE1b = createId
17b0: 45 78 70 72 28 7a 41 6c 69 61 73 31 29 3b 0a 20  Expr(zAlias1);. 
17c0: 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20   if( zAlias2==0 
17d0: 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20 3d  ){.    zAlias2 =
17e0: 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab2->zName;. 
17f0: 20 7d 0a 20 20 70 45 32 62 20 3d 20 63 72 65 61   }.  pE2b = crea
1800: 74 65 49 64 45 78 70 72 28 7a 41 6c 69 61 73 32  teIdExpr(zAlias2
1810: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1820: 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  te3Expr(TK_DOT, 
1830: 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a  pE1b, pE1a, 0);.
1840: 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33    pE2c = sqlite3
1850: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 45 32  Expr(TK_DOT, pE2
1860: 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70  b, pE2a, 0);.  p
1870: 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  E = sqlite3Expr(
1880: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
1890: 63 2c 20 30 29 3b 0a 20 20 45 78 70 72 53 65 74  c, 0);.  ExprSet
18a0: 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
18b0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 70 45 2d  FromJoin);.  pE-
18c0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
18d0: 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62   = iRightJoinTab
18e0: 6c 65 3b 0a 20 20 2a 70 70 45 78 70 72 20 3d 20  le;.  *ppExpr = 
18f0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 2a  sqlite3ExprAnd(*
1900: 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a  ppExpr, pE);.}..
1910: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50  /*.** Set the EP
1920: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
1930: 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ty on all terms 
1940: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1950: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20  ression..** And 
1960: 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69  set the Expr.iRi
1970: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20  ghtJoinTable to 
1980: 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79  iTable for every
1990: 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20   term in the.** 
19a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
19b0: 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  * The EP_FromJoi
19c0: 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  n property is us
19d0: 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61  ed on terms of a
19e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
19f0: 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54  tell.** the LEFT
1a00: 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63   OUTER JOIN proc
1a10: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61  essing logic tha
1a20: 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70  t this term is p
1a30: 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f  art of the.** jo
1a40: 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73  in restriction s
1a50: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
1a60: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
1a70: 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72  se and not a par
1a80: 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65  t.** of the more
1a90: 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63   general WHERE c
1aa0: 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65  lause.  These te
1ab0: 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76  rms are moved ov
1ac0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45  er to the.** WHE
1ad0: 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67  RE clause during
1ae0: 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67   join processing
1af0: 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20   but we need to 
1b00: 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68  remember that th
1b10: 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64  ey.** originated
1b20: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
1b30: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
1b40: 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68  * The Expr.iRigh
1b50: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73  tJoinTable tells
1b60: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1b70: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  e processing tha
1b80: 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  t the.** express
1b90: 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ion depends on t
1ba0: 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54  able iRightJoinT
1bb0: 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61  able even if tha
1bc0: 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a  t table is not.*
1bd0: 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e  * explicitly men
1be0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78  tioned in the ex
1bf0: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20  pression.  That 
1c00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
1c10: 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73  eeded.** for cas
1c20: 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  es like this:.**
1c30: 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
1c40: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
1c50: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
1c60: 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a  b AND t1.x=5.**.
1c70: 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61  ** The where cla
1c80: 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66  use needs to def
1c90: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
1ca0: 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a  of the t1.x=5.**
1cb0: 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65   term until afte
1cc0: 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66  r the t2 loop of
1cd0: 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74   the join.  In t
1ce0: 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55  hat way, a.** NU
1cf0: 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62  LL t2 row will b
1d00: 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65  e inserted whene
1d10: 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66  ver t1.x!=5.  If
1d20: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65   we do not.** de
1d30: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
1d40: 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77   of t1.x=5, it w
1d50: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
1d60: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
1d70: 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f  after the t1 loo
1d80: 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20  p and rows with 
1d90: 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76  t1.x!=5 will nev
1da0: 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20  er appear in.** 
1db0: 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63  the output, whic
1dc0: 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a  h is incorrect..
1dd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1de0: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
1df0: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
1e00: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1e10: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1e20: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
1e30: 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68  n);.    p->iRigh
1e40: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61  tJoinTable = iTa
1e50: 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e  ble;.    setJoin
1e60: 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69  Expr(p->pLeft, i
1e70: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20  Table);.    p = 
1e80: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a  p->pRight;.  } .
1e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1ea0: 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20  utine processes 
1eb0: 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61  the join informa
1ec0: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
1ed0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1ee0: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1ef0: 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74  uses are convert
1f00: 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65  ed into extra te
1f10: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
1f20: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55   clause..** NATU
1f30: 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63  RAL joins also c
1f40: 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52  reate extra WHER
1f50: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  E clause terms..
1f60: 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20  **.** The terms 
1f70: 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  of a FROM clause
1f80: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
1f90: 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72  n the Select.pSr
1fa0: 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  c structure..** 
1fb0: 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61  The left most ta
1fc0: 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74  ble is the first
1fd0: 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74   entry in Select
1fe0: 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68  .pSrc.  The righ
1ff0: 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20  t-most.** table 
2000: 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  is the last entr
2010: 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65  y.  The join ope
2020: 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e  rator is held in
2030: 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a   the entry to.**
2040: 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73   the left.  Thus
2050: 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e   entry 0 contain
2060: 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
2070: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e  tor for the join
2080: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72   between.** entr
2090: 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e  ies 0 and 1.  An
20a0: 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  y ON or USING cl
20b0: 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64  auses associated
20c0: 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61   with the join a
20d0: 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63  re.** also attac
20e0: 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  hed to the left 
20f0: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
2100: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2110: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2120: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
2130: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2140: 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  t sqliteProcessJ
2150: 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  oin(Parse *pPars
2160: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2170: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69   /* All tables i
21a0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
21b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21e0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72  ounters */.  str
21f0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2200: 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20   *pLeft;     /* 
2210: 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67  Left table being
2220: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72   joined */.  str
2230: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2240: 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20   *pRight;    /* 
2250: 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e  Right table bein
2260: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70  g joined */..  p
2270: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
2280: 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e   pLeft = &pSrc->
2290: 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d  a[0];.  pRight =
22a0: 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f   &pLeft[1];.  fo
22b0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
22c0: 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67  Src-1; i++, pRig
22d0: 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a  ht++, pLeft++){.
22e0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74      Table *pLeft
22f0: 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61  Tab = pLeft->pTa
2300: 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52  b;.    Table *pR
2310: 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68 74  ightTab = pRight
2320: 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 69 66 28  ->pTab;..    if(
2330: 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20   pLeftTab==0 || 
2340: 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63  pRightTab==0 ) c
2350: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2360: 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41   When the NATURA
2370: 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  L keyword is pre
2380: 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20  sent, add WHERE 
2390: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72  clause terms for
23a0: 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f  .    ** every co
23b0: 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77  lumn that the tw
23c0: 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  o tables have in
23d0: 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a   common..    */.
23e0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6a      if( pLeft->j
23f0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2400: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2410: 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 7c 7c 20  ( pLeft->pOn || 
2420: 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29 7b  pLeft->pUsing ){
2430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2440: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2450: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
2460: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
2470: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
2480: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2490: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
24a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
24b0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
24c0: 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f   j<pLeftTab->nCo
24d0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
24e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
24f0: 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  LeftTab->aCol[j]
2500: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2510: 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  if( columnIndex(
2520: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
2530: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2540: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 7a    addWhereTerm(z
2550: 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20  Name, pLeftTab, 
2560: 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a  pLeft->zAlias, .
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2590: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
25a0: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
25d0: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
25e0: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  re);.          .
25f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2600: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2610: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2620: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2630: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2640: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2650: 66 28 20 70 4c 65 66 74 2d 3e 70 4f 6e 20 26 26  f( pLeft->pOn &&
2660: 20 70 4c 65 66 74 2d 3e 70 55 73 69 6e 67 20 29   pLeft->pUsing )
2670: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2680: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2690: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
26a0: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
26b0: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
26c0: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
26d0: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
26e0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
26f0: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2700: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2710: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2720: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2730: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
2740: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
2750: 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  /.    if( pLeft-
2760: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 73 65  >pOn ){.      se
2770: 74 4a 6f 69 6e 45 78 70 72 28 70 4c 65 66 74 2d  tJoinExpr(pLeft-
2780: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
2790: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
27a0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
27b0: 33 45 78 70 72 41 6e 64 28 70 2d 3e 70 57 68 65  3ExprAnd(p->pWhe
27c0: 72 65 2c 20 70 4c 65 66 74 2d 3e 70 4f 6e 29 3b  re, pLeft->pOn);
27d0: 0a 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 70 4f  .      pLeft->pO
27e0: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
27f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2800: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2810: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2820: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2830: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2840: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2850: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2860: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
2870: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
2880: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
2890: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
28a0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
28b0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
28c0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
28d0: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
28e0: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
28f0: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2900: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2910: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2920: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2930: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2940: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2950: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
2960: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
2970: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
2980: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 70 55     if( pLeft->pU
2990: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64  sing ){.      Id
29a0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 4c  List *pList = pL
29b0: 65 66 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  eft->pUsing;.   
29c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
29d0: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
29e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
29f0: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
2a00: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
2a10: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
2a20: 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65  (pLeftTab, zName
2a30: 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64  )<0 || columnInd
2a40: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
2a50: 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ame)<0 ){.      
2a60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2a70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2a80: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
2a90: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
2aa0: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
2ab0: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
2ac0: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
2ad0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2ae0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2af0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
2b00: 68 65 72 65 54 65 72 6d 28 7a 4e 61 6d 65 2c 20  hereTerm(zName, 
2b10: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2b20: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
2b50: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
2b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
2b80: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
2b90: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  ->pWhere);.     
2ba0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
2bb0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2bc0: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69 6e  * Insert code in
2bd0: 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c 6c  to "v" that will
2be0: 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64   push the record
2bf0: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
2c00: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f  he.** stack into
2c10: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
2c20: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
2c30: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
2c40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2c50: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
2c60: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
2c70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2c80: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
2c90: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53  BY clause */.  S
2ca0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
2cb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
2cc0: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
2cd0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
2ce0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2cf0: 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  dbe;.  sqlite3Ex
2d00: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2d10: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
2d20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
2d30: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 71 75 65  ddOp(v, OP_Seque
2d40: 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  nce, pOrderBy->i
2d50: 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 73  ECursor, 0);.  s
2d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
2d70: 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 70 4f 72 64  v, OP_Pull, pOrd
2d80: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c  erBy->nExpr + 1,
2d90: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
2da0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
2db0: 6b 65 52 65 63 6f 72 64 2c 20 70 4f 72 64 65 72  keRecord, pOrder
2dc0: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 32 2c 20 30  By->nExpr + 2, 0
2dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2de0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49  AddOp(v, OP_IdxI
2df0: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
2e00: 3e 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20  >iECursor, 0);. 
2e10: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
2e20: 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 69  imit>=0 ){.    i
2e30: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
2e40: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
2e50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
2e60: 20 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70   OP_IfMemZero, p
2e70: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31  Select->iLimit+1
2e80: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2e90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
2ea0: 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 53  _MemIncr, -1, pS
2eb0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 2b 31 29  elect->iLimit+1)
2ec0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
2ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
2ee0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
2ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2f00: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2f10: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
2f20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
2f30: 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  Last, pOrderBy->
2f40: 69 45 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  iECursor, 0);.  
2f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f60: 4f 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  Op(v, OP_Delete,
2f70: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
2f80: 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  sor, 0);.    sql
2f90: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
2fa0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20  (v, addr2);.    
2fb0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
2fc0: 3d 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = -1;.  }.}../*.
2fd0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
2fe0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
2ff0: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
3000: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
3010: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
3020: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
3030: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
3040: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
3050: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
3060: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3070: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
3080: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3090: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
30a0: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
30b0: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ent record */.  
30c0: 69 6e 74 20 6e 50 6f 70 20 20 20 20 20 20 20 20  int nPop        
30d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
30e0: 69 6d 65 73 20 74 6f 20 70 6f 70 20 73 74 61 63  imes to pop stac
30f0: 6b 20 77 68 65 6e 20 6a 75 6d 70 69 6e 67 20 2a  k when jumping *
3100: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
3110: 66 66 73 65 74 3e 3d 30 20 26 26 20 69 43 6f 6e  ffset>=0 && iCon
3120: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3130: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
3150: 2c 20 4f 50 5f 4d 65 6d 49 6e 63 72 2c 20 2d 31  , OP_MemIncr, -1
3160: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20  , p->iOffset);. 
3170: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
3190: 5f 49 66 4d 65 6d 4e 65 67 2c 20 70 2d 3e 69 4f  _IfMemNeg, p->iO
31a0: 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 69  ffset, 0);.    i
31b0: 66 28 20 6e 50 6f 70 3e 30 20 29 7b 0a 20 20 20  f( nPop>0 ){.   
31c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31d0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e  dOp(v, OP_Pop, n
31e0: 50 6f 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Pop, 0);.    }. 
31f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3200: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
3210: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
3220: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
3230: 76 2c 20 22 23 20 73 6b 69 70 20 4f 46 46 53 45  v, "# skip OFFSE
3240: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
3250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
3260: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
3270: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3280: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3290: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
32a0: 72 65 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  re the top N ele
32b0: 6d 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ments of the.** 
32c0: 73 74 61 63 6b 20 61 72 65 20 64 69 73 74 69 6e  stack are distin
32d0: 63 74 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ct.  iTab is a s
32e0: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
32f0: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3300: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
3310: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3320: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3330: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3340: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3350: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3360: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3370: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3380: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3390: 20 74 68 65 20 4b 20 76 61 6c 75 65 73 20 61 72   the K values ar
33a0: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
33b0: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
33c0: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
33d0: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
33e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
33f0: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
3400: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3410: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
3420: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
3430: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  VM */.  int iTab
3440: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
3450: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
3460: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
3470: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
3480: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
3490: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
34a0: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
34b0: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
34d0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
34e0: 73 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 6d  s of the stack m
34f0: 75 73 74 20 62 65 20 64 69 73 74 69 6e 63 74 20  ust be distinct 
3500: 2a 2f 0a 20 20 69 6e 74 20 4b 20 20 20 20 20 20  */.  int K      
3510: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 20 4b          /* Pop K
3520: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74   elements from t
3530: 68 65 20 73 74 61 63 6b 20 69 66 20 69 6e 64 69  he stack if indi
3540: 73 74 69 6e 63 74 20 2a 2f 0a 29 7b 0a 23 69 66  stinct */.){.#if
3550: 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f 44 49 53   NULL_ALWAYS_DIS
3560: 54 49 4e 43 54 0a 20 20 73 71 6c 69 74 65 33 56  TINCT.  sqlite3V
3570: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
3580: 73 4e 75 6c 6c 2c 20 2d 4e 2c 20 73 71 6c 69 74  sNull, -N, sqlit
3590: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
35a0: 72 28 76 29 2b 36 29 3b 0a 23 65 6e 64 69 66 0a  r(v)+6);.#endif.
35b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35c0: 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  Op(v, OP_MakeRec
35d0: 6f 72 64 2c 20 2d 4e 2c 20 30 29 3b 0a 20 20 73  ord, -N, 0);.  s
35e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
35f0: 76 2c 20 4f 50 5f 44 69 73 74 69 6e 63 74 2c 20  v, OP_Distinct, 
3600: 69 54 61 62 2c 20 73 71 6c 69 74 65 33 56 64 62  iTab, sqlite3Vdb
3610: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
3620: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
3630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
3640: 2c 20 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , K, 0);.  sqlit
3650: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
3660: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 52  P_Goto, 0, addrR
3670: 65 70 65 61 74 29 3b 0a 20 20 56 64 62 65 43 6f  epeat);.  VdbeCo
3680: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 73 6b 69  mment((v, "# ski
3690: 70 20 69 6e 64 69 73 74 69 6e 63 74 20 72 65 63  p indistinct rec
36a0: 6f 72 64 73 22 29 29 3b 0a 20 20 73 71 6c 69 74  ords"));.  sqlit
36b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
36c0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
36d0: 62 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  b, 0);.}.../*.**
36e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
36f0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
3700: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
3710: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
3720: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
3730: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
3740: 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72  b and nColumn ar
3750: 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65  e both zero, the
3760: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
3770: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
3780: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
3790: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
37a0: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
37b0: 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a    If nColumn>0.*
37c0: 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70  * then data is p
37d0: 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61  ulled from srcTa
37e0: 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20  b and pEList is 
37f0: 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74  used only to get
3800: 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65   the.** datatype
3810: 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
3820: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3830: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
3840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
3850: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3860: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
3870: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
3880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3890: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
38a0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
38b0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
38c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
38d0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
38e0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
38f0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
3900: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
3910: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
3920: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
3930: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
3940: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
3950: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3960: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
3970: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
3980: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3990: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
39a0: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
39b0: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
39c0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
39d0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
39e0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
39f0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
3a00: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
3a10: 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20 20  int eDest,      
3a20: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
3a30: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
3a40: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
3a50: 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
3a60: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 67 75        /* An argu
3a70: 6d 65 6e 74 20 74 6f 20 74 68 65 20 64 69 73 70  ment to the disp
3a80: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
3a90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
3aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
3ab0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
3ac0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
3ad0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 2c  */.  int iBreak,
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3af0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
3b00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
3b10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  ner loop */.  ch
3b20: 61 72 20 2a 61 66 66 20 20 20 20 20 20 20 20 20  ar *aff         
3b30: 20 20 20 20 20 20 2f 2a 20 61 66 66 69 6e 69 74        /* affinit
3b40: 79 20 73 74 72 69 6e 67 20 69 66 20 65 44 65 73  y string if eDes
3b50: 74 20 69 73 20 53 52 54 5f 55 6e 69 6f 6e 20 2a  t is SRT_Union *
3b60: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
3b70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
3b80: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
3b90: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
3ba0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
3bb0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
3bc0: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
3bd0: 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ..  if( v==0 ) r
3be0: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
3bf0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
3c00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
3c10: 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
3c20: 65 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  e on the SELECT 
3c30: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
3c40: 64 6f 20 74 68 65 20 63 68 65 63 6b 0a 20 20 2a  do the check.  *
3c50: 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 69 73  * to see if this
3c60: 20 72 6f 77 20 73 68 6f 75 6c 64 20 62 65 20 6f   row should be o
3c70: 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 68 61  utput..  */.  ha
3c80: 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74  sDistinct = dist
3c90: 69 6e 63 74 3e 3d 30 20 26 26 20 70 45 4c 69 73  inct>=0 && pELis
3ca0: 74 2d 3e 6e 45 78 70 72 3e 30 3b 0a 20 20 69 66  t->nExpr>0;.  if
3cb0: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
3cc0: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
3cd0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
3ce0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  v, p, iContinue,
3cf0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50   0);.  }..  /* P
3d00: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
3d10: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
3d20: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
3d30: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3d40: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
3d50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
3d60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
3d70: 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 29  lumn, srcTab, i)
3d80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
3d90: 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70  .    nColumn = p
3da0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
3db0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3dc0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
3dd0: 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
3de0: 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54    /* If the DIST
3df0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73  INCT keyword was
3e00: 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20   present on the 
3e10: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3e20: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72  .  ** and this r
3e30: 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  ow has been seen
3e40: 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f   before, then do
3e50: 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72   not make this r
3e60: 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20  ow.  ** part of 
3e70: 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f  the result..  */
3e80: 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e  .  if( hasDistin
3e90: 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  ct ){.    int n 
3ea0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
3eb0: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
3ec0: 74 28 76 2c 20 64 69 73 74 69 6e 63 74 2c 20 69  t(v, distinct, i
3ed0: 43 6f 6e 74 69 6e 75 65 2c 20 6e 2c 20 6e 2b 31  Continue, n, n+1
3ee0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  );.    if( pOrde
3ef0: 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
3f00: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
3f10: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
3f20: 75 6d 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  umn);.    }.  }.
3f30: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
3f40: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
3f50: 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65  is mode, write e
3f60: 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ach query result
3f70: 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74   to the key of t
3f80: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
3f90: 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e   ** table iParm.
3fa0: 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
3fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
3fc0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20  OUND_SELECT.    
3fd0: 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20  case SRT_Union: 
3fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
3ff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4000: 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75  akeRecord, nColu
4010: 6d 6e 2c 20 4e 55 4c 4c 5f 41 4c 57 41 59 53 5f  mn, NULL_ALWAYS_
4020: 44 49 53 54 49 4e 43 54 29 3b 0a 20 20 20 20 20  DISTINCT);.     
4030: 20 69 66 28 20 61 66 66 20 29 7b 0a 20 20 20 20   if( aff ){.    
4040: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
4050: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 61  hangeP3(v, -1, a
4060: 66 66 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a  ff, P3_STATIC);.
4070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4090: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
40a0: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
40b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
40c0: 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20     /* Construct 
40d0: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
40e0: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20  e query result, 
40f0: 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20  but instead of. 
4100: 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61     ** saving tha
4110: 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74  t record, use it
4120: 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c   as a key to del
4130: 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f  ete elements fro
4140: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d  m.    ** the tem
4150: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61  porary table iPa
4160: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rm..    */.    c
4170: 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20  ase SRT_Except: 
4180: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
4190: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
41a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
41b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
41c0: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 4e 55 4c 4c 5f  , nColumn, NULL_
41d0: 41 4c 57 41 59 53 5f 44 49 53 54 49 4e 43 54 29  ALWAYS_DISTINCT)
41e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
41f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
4200: 31 2c 20 61 66 66 2c 20 50 33 5f 53 54 41 54 49  1, aff, P3_STATI
4210: 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
4220: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4230: 5f 4e 6f 74 46 6f 75 6e 64 2c 20 69 50 61 72 6d  _NotFound, iParm
4240: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
4250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4260: 70 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  p(v, OP_Delete, 
4270: 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20  iParm, 0);.     
4280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4290: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  ndif..    /* Sto
42a0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
42b0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
42c0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
42d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
42e0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
42f0: 54 5f 56 69 72 74 75 61 6c 54 61 62 3a 20 7b 0a  T_VirtualTab: {.
4300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4310: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b  eAddOp(v, OP_Mak
4320: 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e  eRecord, nColumn
4330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4340: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
4350: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
4360: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
4370: 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d  rBy, p);.      }
4380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
4390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
43a0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
43b0: 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  Parm, 0);.      
43c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
43d0: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
43e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
43f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4400: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
4410: 72 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rm, 0);.      }.
4420: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4430: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
4440: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4450: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
4460: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
4470: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
4480: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
4490: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
44a0: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
44b0: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
44c0: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
44d0: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
44e0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
44f0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
4500: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
4510: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4520: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
4530: 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  nt addr1 = sqlit
4540: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4550: 72 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  r(v);.      int 
4560: 61 64 64 72 32 3b 0a 0a 20 20 20 20 20 20 61 73  addr2;..      as
4570: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
4580: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4590: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
45a0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
45b0: 64 72 31 2b 33 29 3b 0a 20 20 20 20 20 20 73 71  dr1+3);.      sq
45c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
45d0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
45e0: 0a 20 20 20 20 20 20 61 64 64 72 32 20 3d 20 73  .      addr2 = s
45f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4600: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30  v, OP_Goto, 0, 0
4610: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
4620: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
4630: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
4640: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
4650: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
4660: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
4670: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
4680: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
4690: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
46a0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
46b0: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
46c0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
46d0: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
46e0: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
46f0: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
4700: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
4710: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
4720: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
4730: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
4740: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
4750: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
4760: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 66  .        char af
4770: 66 69 6e 69 74 79 20 3d 20 28 69 50 61 72 6d 3e  finity = (iParm>
4780: 3e 31 36 29 26 30 78 46 46 3b 0a 20 20 20 20 20  >16)&0xFF;.     
4790: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
47a0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
47b0: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
47c0: 5d 2e 70 45 78 70 72 2c 20 61 66 66 69 6e 69 74  ].pExpr, affinit
47d0: 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
47e0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
47f0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
4800: 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
4810: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4820: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4830: 5f 49 64 78 49 6e 73 65 72 74 2c 20 28 69 50 61  _IdxInsert, (iPa
4840: 72 6d 26 30 78 30 30 30 30 46 46 46 46 29 2c 20  rm&0x0000FFFF), 
4850: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
4860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4870: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
4880: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4890: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
48a0: 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
48b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
48c0: 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
48d0: 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
48e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
48f0: 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
4900: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4910: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31  (v, OP_MemInt, 1
4920: 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  , iParm);.      
4930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4940: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c  (v, OP_Pop, nCol
4950: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  umn, 0);.      /
4960: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
4970: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
4980: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
4990: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
49a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
49b0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
49c0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
49d0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
49e0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
49f0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
4a00: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
4a10: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
4a20: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
4a30: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
4a40: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
4a50: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
4a60: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
4a70: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
4a80: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
4a90: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
4aa0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
4ab0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
4ac0: 42 79 2c 20 70 29 3b 0a 20 20 20 20 20 20 7d 65  By, p);.      }e
4ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
4af0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 50   OP_MemStore, iP
4b00: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  arm, 1);.       
4b10: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
4b20: 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
4b30: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
4b40: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d  or us */.      }
4b50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4b60: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
4b70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4b80: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
4b90: 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 64     /* Send the d
4ba0: 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  ata to the callb
4bb0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ack function or 
4bc0: 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e  to a subroutine.
4bd0: 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20    In the.    ** 
4be0: 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f 75  case of a subrou
4bf0: 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f 75  tine, the subrou
4c00: 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20 72  tine itself is r
4c10: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20  esponsible for. 
4c20: 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68     ** popping th
4c30: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
4c40: 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20  stack..    */.  
4c50: 20 20 63 61 73 65 20 53 52 54 5f 53 75 62 72 6f    case SRT_Subro
4c60: 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20  utine:.    case 
4c70: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a  SRT_Callback: {.
4c80: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
4c90: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  By ){.        sq
4ca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4cb0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4cc0: 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20   nColumn, 0);.  
4cd0: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
4ce0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
4cf0: 64 65 72 42 79 2c 20 70 29 3b 0a 20 20 20 20 20  derBy, p);.     
4d00: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
4d10: 3d 3d 53 52 54 5f 53 75 62 72 6f 75 74 69 6e 65  ==SRT_Subroutine
4d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4d30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4d40: 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69 50 61  OP_Gosub, 0, iPa
4d50: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
4d60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4d70: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4d80: 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c 75  _Callback, nColu
4d90: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  mn, 0);.      }.
4da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4db0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
4dc0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
4dd0: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
4de0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
4df0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4e00: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
4e10: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
4e20: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
4e30: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
4e40: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
4e50: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
4e60: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
4e70: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
4e80: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
4e90: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
4ea0: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
4eb0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
4ec0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
4ed0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
4ee0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4ef0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
4f00: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
4f10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4f20: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4f30: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4f40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4f50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
4f60: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
4f70: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
4f80: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
4f90: 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
4fa0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3e 3d   if( p->iLimit>=
4fb0: 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
4fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
4fd0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
4fe0: 65 6d 49 6e 63 72 2c 20 2d 31 2c 20 70 2d 3e 69  emIncr, -1, p->i
4ff0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
5000: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5010: 4f 50 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d  OP_IfMemZero, p-
5020: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
5030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5050: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
5060: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
5070: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5080: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
5090: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
50a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
50b0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
50c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
50d0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
50e0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
50f0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
5100: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
5110: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
5120: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
5130: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5140: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5150: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
5160: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
5170: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
5180: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
5190: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
51a0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
51b0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
51c0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
51d0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
51e0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
51f0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
5200: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
5210: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
5220: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
5230: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
5240: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
5250: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
5260: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
5270: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
5280: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
5290: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
52a0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
52b0: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
52c0: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
52d0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
52e0: 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66 20 61  he P3 field of a
52f0: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
5300: 2a 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P3_KEYINFO_HAN
5310: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
5320: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
5330: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
5340: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
5350: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
5360: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
5370: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
5380: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
5390: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
53a0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
53b0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
53c0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
53d0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
53e0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
53f0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
5400: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
5410: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
5420: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
5430: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
5440: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
5450: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
5460: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
5470: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
5480: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
5490: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
54a0: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
54b0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
54c0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
54d0: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
54e0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
54f0: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
5500: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
5510: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
5520: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
5530: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
5540: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
5550: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
5560: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
5570: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
5580: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
5590: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
55a0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
55b0: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
55c0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
55d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
55e0: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
55f0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5600: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
5610: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
5620: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
5630: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
5640: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
5650: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
5660: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
5670: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
5680: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
5690: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
56a0: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
56b0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
56c0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
56d0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
56e0: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
56f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5700: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
5710: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
5720: 73 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 72  se,   /* The par
5730: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5740: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5750: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
5760: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
5770: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
5780: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5790: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
57a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
57b0: 6e 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n,     /* Number
57c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
57d0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ata */.  int eDe
57e0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  st,       /* Wri
57f0: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
5800: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
5810: 69 6e 74 20 69 50 61 72 6d 20 20 20 20 20 20 20  int iParm       
5820: 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 70 61 72   /* Optional par
5830: 61 6d 65 74 65 72 20 61 73 73 6f 63 69 61 74 65  ameter associate
5840: 64 20 77 69 74 68 20 65 44 65 73 74 20 2a 2f 0a  d with eDest */.
5850: 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73  ){.  int brk = s
5860: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
5870: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f  bel(v);.  int co
5880: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
5890: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
58a0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
58b0: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
58c0: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
58d0: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 54 61  pOrderBy;..  iTa
58e0: 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  b = pOrderBy->iE
58f0: 43 75 72 73 6f 72 3b 0a 20 20 61 64 64 72 20 3d  Cursor;.  addr =
5900: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
5910: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74  AddOp(v, OP_Sort
5920: 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20  , iTab, brk);.  
5930: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
5940: 20 63 6f 6e 74 2c 20 30 29 3b 0a 20 20 73 71 6c   cont, 0);.  sql
5950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5960: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
5970: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
5980: 72 20 2b 20 31 29 3b 0a 20 20 73 77 69 74 63 68  r + 1);.  switch
5990: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
59a0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
59b0: 20 20 20 63 61 73 65 20 53 52 54 5f 56 69 72 74     case SRT_Virt
59c0: 75 61 6c 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  ualTab: {.      
59d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
59e0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
59f0: 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20 20 20   iParm, 0);.    
5a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5a10: 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31  Op(v, OP_Pull, 1
5a20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5a30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5a40: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
5a50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5a60: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
5a70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5a80: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
5a90: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
5aa0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
5ab0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
5ac0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
5ad0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
5ae0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
5af0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
5b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5b10: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
5b20: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
5b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
5b40: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
5b50: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
5b60: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 20  ddr(v)+3);.     
5b70: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
5b80: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5b90: 2c 20 31 2c 20 30 2c 20 22 63 22 2c 20 50 33 5f  , 1, 0, "c", P3_
5ba0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
5bb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
5bc0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
5bd0: 20 28 69 50 61 72 6d 26 30 78 30 30 30 30 46 46   (iParm&0x0000FF
5be0: 46 46 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  FF), 0);.      b
5bf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5c00: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5c10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5c20: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5c30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5c40: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
5c50: 65 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  e, iParm, 1);.  
5c60: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
5c70: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
5c80: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
5c90: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
5ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5cb0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 52 54  dif.    case SRT
5cc0: 5f 43 61 6c 6c 62 61 63 6b 3a 0a 20 20 20 20 63  _Callback:.    c
5cd0: 61 73 65 20 53 52 54 5f 53 75 62 72 6f 75 74 69  ase SRT_Subrouti
5ce0: 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ne: {.      int 
5cf0: 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
5d00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5d10: 49 6e 74 65 67 65 72 2c 20 70 2d 3e 70 45 4c 69  Integer, p->pELi
5d20: 73 74 2d 3e 6e 45 78 70 72 2c 20 30 29 3b 0a 20  st->nExpr, 0);. 
5d30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5d40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
5d50: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 1, 0);.      f
5d60: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
5d70: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
5d80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d90: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
5da0: 2d 31 2d 69 2c 20 69 29 3b 0a 20 20 20 20 20 20  -1-i, i);.      
5db0: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
5dc0: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
5dd0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5de0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
5df0: 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 6e 43 6f 6c  P_Callback, nCol
5e00: 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  umn, 0);.      }
5e10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
5e30: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 69  , OP_Gosub, 0, i
5e40: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
5e50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
5e70: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   2, 0);.      br
5e80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
5e90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5ea0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
5eb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5ec0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
5ed0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
5ee0: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 20 74   the loop when t
5ef0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
5f00: 68 65 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  hed.  */.  if( p
5f10: 2d 3e 69 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20  ->iLimit>=0 ){. 
5f20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5f30: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 63  dOp(v, OP_MemInc
5f40: 72 2c 20 2d 31 2c 20 70 2d 3e 69 4c 69 6d 69 74  r, -1, p->iLimit
5f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5f60: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
5f70: 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  MemZero, p->iLim
5f80: 69 74 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 0a 20  it, brk);.  }.. 
5f90: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
5fa0: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
5fb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
5fc0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e  olveLabel(v, con
5fd0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
5fe0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78  eAddOp(v, OP_Nex
5ff0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
6000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
6010: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b  olveLabel(v, brk
6020: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6030: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6040: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
6050: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
6060: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
6070: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
6080: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
6090: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
60a0: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
60b0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
60c0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
60d0: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
60e0: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
60f0: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
6100: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
6110: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
6120: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
6130: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
6140: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
6150: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
6160: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
6170: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
6180: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
6190: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
61a0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
61b0: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
61c0: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
61d0: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
61e0: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
61f0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
6200: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
6210: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
6220: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
6230: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
6240: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
6250: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
6260: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
6270: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
6280: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
6290: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
62a0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
62b0: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
62c0: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
62d0: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
62e0: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
62f0: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
6300: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
6310: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
6320: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
6330: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
6340: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
6350: 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d  olumnType(.  Nam
6360: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
6370: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
6380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
6390: 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73  OriginDb,.  cons
63a0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
63b0: 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nTab,.  const ch
63c0: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c  ar **pzOriginCol
63d0: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
63e0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63   *zType = 0;.  c
63f0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
6400: 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  inDb = 0;.  char
6410: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54   const *zOriginT
6420: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
6430: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c  onst *zOriginCol
6440: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
6450: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
6460: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
6470: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
6480: 20 2f 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70   /* The TK_AS op
6490: 65 72 61 74 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  erator can only 
64a0: 6f 63 63 75 72 20 69 6e 20 4f 52 44 45 52 20 42  occur in ORDER B
64b0: 59 2c 20 47 52 4f 55 50 20 42 59 2c 20 48 41 56  Y, GROUP BY, HAV
64c0: 49 4e 47 2c 0a 20 20 2a 2a 20 61 6e 64 20 4c 49  ING,.  ** and LI
64d0: 4d 49 54 20 63 6c 61 75 73 65 73 2e 20 20 42 75  MIT clauses.  Bu
64e0: 74 20 70 45 78 70 72 20 6f 72 69 67 69 6e 61 74  t pExpr originat
64f0: 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
6500: 20 73 65 74 20 6f 66 20 61 0a 20 20 2a 2a 20 53   set of a.  ** S
6510: 45 4c 45 43 54 2e 20 20 53 6f 20 70 45 78 70 72  ELECT.  So pExpr
6520: 20 63 61 6e 20 6e 65 76 65 72 20 63 6f 6e 74 61   can never conta
6530: 69 6e 20 61 6e 20 41 53 20 6f 70 65 72 61 74 6f  in an AS operato
6540: 72 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  r..  */.  assert
6550: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
6560: 41 53 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  AS );..  switch(
6570: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
6580: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
6590: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
65a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
65b0: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
65c0: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
65d0: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
65e0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
65f0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
6600: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
6610: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
6620: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
6630: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
6640: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
6650: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
6660: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
6670: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
6680: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
6690: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
66a0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
66b0: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
66d0: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
66e0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
66f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
6700: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
6710: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
6720: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
6730: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
6740: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
6750: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
6760: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
6770: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
6780: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
6790: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
67a0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
67b0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
67c0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
67d0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
67e0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
67f0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
6800: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
6810: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
6820: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
6830: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
6840: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6850: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
6860: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
6870: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6880: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
6890: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20     /* FIX ME:.  
68a0: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61        ** This ca
68b0: 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20  n occurs if you 
68c0: 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c  have something l
68d0: 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e  ike "SELECT new.
68e0: 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20  x;" inside.     
68f0: 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e     ** a trigger.
6900: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
6910: 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e  , if you referen
6920: 63 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  ce the special "
6930: 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20  new".        ** 
6940: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73  table in the res
6950: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c  ult set of a sel
6960: 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ect.  We do not 
6970: 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a  have a good way.
6980: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69          ** to fi
6990: 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 74 61  nd the actual ta
69a0: 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c  ble type, so cal
69b0: 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20 54 68  l it "TEXT".  Th
69c0: 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20  is is really.   
69d0: 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e       ** somethin
69e0: 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20  g of a bug, but 
69f0: 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  I do not know ho
6a00: 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20  w to fix it..   
6a10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
6a20: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65  ** This code doe
6a30: 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68  s not produce th
6a40: 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
6a50: 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65 76 65   - it just preve
6a60: 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  nts.        ** a
6a70: 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20   segfault.  See 
6a80: 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20  ticket #1229..  
6a90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6aa0: 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b   zType = "TEXT";
6ab0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6ac0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
6ad0: 73 73 65 72 74 28 20 70 54 61 62 20 29 3b 0a 23  ssert( pTab );.#
6ae0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6af0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
6b00: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
6b10: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
6b20: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
6b30: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
6b40: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
6b50: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
6b60: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
6b70: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
6b80: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
6b90: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
6ba0: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
6bb0: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
6bc0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
6bd0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
6be0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
6bf0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
6c00: 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  && iCol<pS->pELi
6c10: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
6c20: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f         /* If iCo
6c30: 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  l is less than z
6c40: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ero, then the ex
6c50: 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74  pression request
6c60: 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
6c70: 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  ** rowid of the 
6c80: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
6c90: 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73  ew. This express
6ca0: 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65  ion is legal (se
6cb0: 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
6cc0: 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e  test case misc2.
6cd0: 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73  2.2) - it always
6ce0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
6cf0: 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  LL..          */
6d00: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
6d10: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
6d20: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
6d30: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43  pS->pEList->a[iC
6d40: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  ol].pExpr;.     
6d50: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
6d60: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
6d70: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78          sNC.pNex
6d80: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
6d90: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
6da0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
6db0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
6dc0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
6dd0: 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f   &zOriginDb, &zO
6de0: 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67  riginTab, &zOrig
6df0: 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20  inCol); .       
6e00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
6e10: 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
6e20: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
6e30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
6e40: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
6e50: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
6e60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
6e70: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
6e80: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
6e90: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
6ea0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
6eb0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
6ec0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
6ed0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
6ee0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
6ef0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
6f00: 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20       zOriginCol 
6f10: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
6f20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6f30: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
6f40: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
6f50: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
6f60: 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  riginCol = pTab-
6f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
6f80: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
6f90: 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20       zOriginTab 
6fa0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
6fb0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
6fc0: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
6fd0: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
6fe0: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
6ff0: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
7000: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
7010: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
7020: 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70  riginDb = pNC->p
7030: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
7040: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
7050: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7080: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7090: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
70a0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
70b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
70c0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
70d0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
70e0: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
70f0: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
7100: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
7110: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
7120: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
7130: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
7140: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
7150: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
7160: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7170: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
7180: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
7190: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
71a0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
71b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e  Expr;.      sNC.
71c0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
71d0: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
71e0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
71f0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7200: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
7210: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7220: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7230: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7240: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7250: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
7260: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7270: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f    }.  .  if( pzO
7280: 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61  riginDb ){.    a
7290: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54  ssert( pzOriginT
72a0: 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f  ab && pzOriginCo
72b0: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
72c0: 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62  inDb = zOriginDb
72d0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54  ;.    *pzOriginT
72e0: 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b  ab = zOriginTab;
72f0: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f  .    *pzOriginCo
7300: 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a  l = zOriginCol;.
7310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79    }.  return zTy
7320: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
7330: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
7340: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
7350: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
7360: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
7370: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
7380: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
7390: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
73a0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
73b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
73c0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
73d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
73e0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
73f0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
7400: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7410: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
7420: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
7430: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
7440: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
7450: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7460: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
7470: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
7480: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7490: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
74a0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
74b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
74c0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
74d0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
74e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
74f0: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
7500: 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  ar *zOrigDb = 0;
7510: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7520: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
7530: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7540: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  OrigCol = 0;.   
7550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
7560: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
7570: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
7580: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
7590: 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f  OrigCol);..    /
75a0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
75b0: 6d 61 6b 65 20 69 74 27 73 20 6f 77 6e 20 63 6f  make it's own co
75c0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
75d0: 2d 74 79 70 65 2c 20 69 6e 20 63 61 73 65 20 74  -type, in case t
75e0: 68 65 20 0a 20 20 20 20 2a 2a 20 73 63 68 65 6d  he .    ** schem
75f0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
7600: 65 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  e this virtual m
7610: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
7620: 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
7630: 20 54 4f 44 4f 3a 20 43 72 65 61 74 65 20 73 6f   TODO: Create so
7640: 6d 65 20 73 79 6d 62 6f 6c 20 74 68 61 74 20 69  me symbol that i
7650: 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 22 2d  s better than "-
7660: 32 30 22 20 74 6f 20 70 61 73 73 20 74 6f 20 0a  20" to pass to .
7670: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
7680: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 29 2e 20  beSetColName(). 
7690: 41 73 20 69 73 20 74 68 69 73 20 69 73 20 61 20  As is this is a 
76a0: 74 69 63 6b 69 6e 67 20 62 6f 6d 62 2e 20 41 6e  ticking bomb. An
76b0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20   alternative.   
76c0: 20 2a 2a 20 69 73 20 74 6f 20 70 61 73 73 20 74   ** is to pass t
76d0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
76e0: 20 73 74 72 69 6e 67 2c 20 62 75 74 20 74 68 61   string, but tha
76f0: 74 20 6d 65 61 6e 73 20 63 61 6c 6c 69 6e 67 20  t means calling 
7700: 73 74 72 6c 65 6e 28 29 0a 20 20 20 20 2a 2a 20  strlen().    ** 
7710: 68 65 72 65 20 77 68 69 63 68 20 63 6f 6e 73 75  here which consu
7720: 6d 65 73 20 63 6f 64 65 20 73 70 61 63 65 2e 20  mes code space. 
7730: 42 79 20 70 61 73 73 69 6e 67 20 61 20 6e 65 67  By passing a neg
7740: 61 74 69 76 65 20 76 61 6c 75 65 20 74 68 61 74  ative value that
7750: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 50   is.    ** not P
7760: 33 5f 44 59 4e 41 4d 49 43 20 6f 72 20 50 33 5f  3_DYNAMIC or P3_
7770: 53 54 41 54 49 43 2c 20 73 74 72 6c 65 6e 28 29  STATIC, strlen()
7780: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 56 64   is called by Vd
7790: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 29 2e 0a  beSetColName()..
77a0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
77b0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
77c0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
77d0: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
77e0: 2d 32 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  -20);.    sqlite
77f0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7800: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41  v, i, COLNAME_DA
7810: 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c  TABASE, zOrigDb,
7820: 20 2d 32 30 29 3b 0a 20 20 20 20 73 71 6c 69 74   -20);.    sqlit
7830: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
7840: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
7850: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
7860: 2d 32 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  -20);.    sqlite
7870: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7880: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
7890: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
78a0: 2d 32 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  -20);.  }.}../*.
78b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
78c0: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
78d0: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
78e0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
78f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
7900: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
7910: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
7920: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
7930: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
7940: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
7950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
7960: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
7970: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
7980: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
7990: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
79a0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
79b0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
79c0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
79d0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
79e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
79f0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
7a00: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
7a10: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7a20: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
7a30: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
7a40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7a50: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
7a60: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
7a70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7a80: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
7a90: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
7aa0: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
7ab0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
7ac0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
7ad0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7ae0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
7af0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( v!=0 );.  if(
7b00: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
7b10: 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20  sSet || v==0 || 
7b20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
7b30: 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e 3b 0a  led() ) return;.
7b40: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
7b50: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
7b60: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
7b70: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
7b80: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
7b90: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
7ba0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
7bb0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
7bc0: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
7bd0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
7be0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
7bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
7c00: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
7c10: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
7c20: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
7c30: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
7c40: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
7c50: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
7c60: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
7c70: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
7c80: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
7c90: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
7ca0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
7cb0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
7cc0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
7cd0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
7ce0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
7cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
7d00: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
7d10: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
7d20: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
7d30: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
7d40: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
7d50: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
7d60: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7d70: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
7d80: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
7d90: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
7da0: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
7db0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
7dc0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
7dd0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
7de0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
7df0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
7e00: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
7e10: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
7e20: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
7e30: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
7e40: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
7e50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
7e60: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
7e70: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
7e80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7e90: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
7ea0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
7eb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
7ec0: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
7ed0: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 26   && !fullNames &
7ee0: 26 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26 20 70  & p->span.z && p
7ef0: 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b 0a 20  ->span.z[0] ){. 
7f00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7f10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
7f20: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
7f30: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
7f40: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  z, p->span.n);. 
7f50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
7f60: 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68  ullNames || (!sh
7f70: 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62  ortNames && pTab
7f80: 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b  List->nSrc>1) ){
7f90: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
7fa0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
7fb0: 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a    char *zTab;. .
7fc0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
7fd0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41  TabList->a[j].zA
7fe0: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66  lias;.        if
7ff0: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a  ( fullNames || z
8000: 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20  Tab==0 ) zTab = 
8010: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
8020: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
8030: 74 72 69 6e 67 28 26 7a 4e 61 6d 65 2c 20 7a 54  tring(&zName, zT
8040: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 28  ab, ".", zCol, (
8050: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
8060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8070: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8080: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8090: 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
80a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
80b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
80c0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
80d0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
80e0: 43 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  Col, strlen(zCol
80f0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
8100: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 70 61  }else if( p->spa
8110: 6e 2e 7a 20 26 26 20 70 2d 3e 73 70 61 6e 2e 7a  n.z && p->span.z
8120: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [0] ){.      sql
8130: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8140: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8150: 5f 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d  _NAME, (char*)p-
8160: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8170: 2e 6e 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71  .n);.      /* sq
8180: 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 73  lite3VdbeCompres
8190: 73 53 70 61 63 65 28 76 2c 20 61 64 64 72 29 3b  sSpace(v, addr);
81a0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
81b0: 20 20 20 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b       char zName[
81c0: 33 30 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  30];.      asser
81d0: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
81e0: 55 4d 4e 20 7c 7c 20 70 54 61 62 4c 69 73 74 3d  UMN || pTabList=
81f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 70 72 69  =0 );.      spri
8200: 6e 74 66 28 7a 4e 61 6d 65 2c 20 22 63 6f 6c 75  ntf(zName, "colu
8210: 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20 20  mn%d", i+1);.   
8220: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8230: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8240: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
8250: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
8260: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
8270: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
8280: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
8290: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
82a0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
82b0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
82c0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
82d0: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
82e0: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
82f0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
8300: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
8310: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
8320: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
8330: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
8340: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
8350: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
8360: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
8370: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
8380: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
8390: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
83a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
83b0: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
83c0: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
83d0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
83e0: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
83f0: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
8400: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
8410: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
8420: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8430: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
8440: 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
8450: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
8460: 61 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c  atic int prepSel
8470: 65 63 74 53 74 6d 74 28 50 61 72 73 65 2a 2c 20  ectStmt(Parse*, 
8480: 53 65 6c 65 63 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  Select*);../*.**
8490: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
84a0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
84b0: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
84c0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
84d0: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
84e0: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
84f0: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
8500: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
8510: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
8520: 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 2a 7a  *pParse, char *z
8530: 54 61 62 4e 61 6d 65 2c 20 53 65 6c 65 63 74 20  TabName, Select 
8540: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
8550: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
8560: 69 2c 20 6a 3b 0a 20 20 45 78 70 72 4c 69 73 74  i, j;.  ExprList
8570: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 43 6f 6c 75   *pEList;.  Colu
8580: 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
8590: 0a 0a 20 20 69 66 28 20 70 72 65 70 53 65 6c 65  ..  if( prepSele
85a0: 63 74 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70  ctStmt(pParse, p
85b0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 72  Select) ){.    r
85c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
85d0: 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
85e0: 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
85f0: 70 53 65 6c 65 63 74 2c 20 30 29 20 29 7b 0a 20  pSelect, 0) ){. 
8600: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8610: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
8620: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 54  Malloc( sizeof(T
8630: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
8640: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
8650: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
8660: 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
8670: 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 54  pTab->zName = zT
8680: 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 53  abName ? sqliteS
8690: 74 72 44 75 70 28 7a 54 61 62 4e 61 6d 65 29 20  trDup(zTabName) 
86a0: 3a 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  : 0;.  pEList = 
86b0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
86c0: 0a 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  .  pTab->nCol = 
86d0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
86e0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
86f0: 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 54 61 62 2d  Col>0 );.  pTab-
8700: 3e 61 43 6f 6c 20 3d 20 61 43 6f 6c 20 3d 20 73  >aCol = aCol = s
8710: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
8720: 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 30  eof(pTab->aCol[0
8730: 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  ])*pTab->nCol );
8740: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
8750: 3d 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  =aCol; i<pTab->n
8760: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
8770: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 2c 20  ){.    Expr *p, 
8780: 2a 70 52 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  *pR;.    char *z
8790: 54 79 70 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Type;.    char *
87a0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20  zName;.    char 
87b0: 2a 7a 42 61 73 65 6e 61 6d 65 3b 0a 20 20 20 20  *zBasename;.    
87c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
87d0: 20 20 20 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20      int cnt;.   
87e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
87f0: 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 47 65  ;.    .    /* Ge
8800: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
8810: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f   name for the co
8820: 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lumn.    */.    
8830: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
8840: 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  .pExpr;.    asse
8850: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30  rt( p->pRight==0
8860: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
8870: 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e  oken.z==0 || p->
8880: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b  pRight->token.z[
8890: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
88a0: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
88b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
88c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
88d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
88e0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
88f0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
8900: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
8910: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
8920: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
8930: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8940: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
8950: 44 4f 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  DOT .           
8960: 20 20 20 26 26 20 28 70 52 3d 70 2d 3e 70 52 69     && (pR=p->pRi
8970: 67 68 74 29 21 3d 30 20 26 26 20 70 52 2d 3e 74  ght)!=0 && pR->t
8980: 6f 6b 65 6e 2e 7a 20 26 26 20 70 52 2d 3e 74 6f  oken.z && pR->to
8990: 6b 65 6e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  ken.z[0] ){.    
89a0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73    /* For columns
89b0: 20 6f 66 20 74 68 65 20 66 72 6f 6d 20 41 2e 42   of the from A.B
89c0: 20 75 73 65 20 42 20 61 73 20 74 68 65 20 6e 61   use B as the na
89d0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
89e0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
89f0: 74 66 28 22 25 54 22 2c 20 26 70 52 2d 3e 74 6f  tf("%T", &pR->to
8a00: 6b 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ken);.    }else 
8a10: 69 66 28 20 70 2d 3e 73 70 61 6e 2e 7a 20 26 26  if( p->span.z &&
8a20: 20 70 2d 3e 73 70 61 6e 2e 7a 5b 30 5d 20 29 7b   p->span.z[0] ){
8a30: 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  .      /* Use th
8a40: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
8a50: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
8a60: 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
8a70: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
8a80: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
8a90: 69 6e 74 66 28 22 25 54 22 2c 20 26 70 2d 3e 73  intf("%T", &p->s
8aa0: 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pan);.    }else{
8ab0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c  .      /* If all
8ac0: 20 65 6c 73 65 20 66 61 69 6c 73 2c 20 6d 61 6b   else fails, mak
8ad0: 65 20 75 70 20 61 20 6e 61 6d 65 20 2a 2f 0a 20  e up a name */. 
8ae0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
8af0: 69 74 65 33 4d 50 72 69 6e 74 66 28 22 63 6f 6c  ite3MPrintf("col
8b00: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 3b 0a 20 20  umn%d", i+1);.  
8b10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
8b20: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
8b30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61     if( sqlite3Ma
8b40: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
8b50: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
8b60: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  (zName);.      s
8b70: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
8b80: 65 28 30 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  e(0, pTab);.    
8b90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
8ba0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
8bb0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
8bc0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
8bd0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
8be0: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
8bf0: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
8c00: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
8c10: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
8c20: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
8c30: 0a 20 20 20 20 7a 42 61 73 65 6e 61 6d 65 20 3d  .    zBasename =
8c40: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28   zName;.    for(
8c50: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
8c60: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
8c70: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
8c80: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
8c90: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
8ca0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8cb0: 4d 50 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c  MPrintf("%s:%d",
8cc0: 20 7a 42 61 73 65 6e 61 6d 65 2c 20 2b 2b 63 6e   zBasename, ++cn
8cd0: 74 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  t);.        j = 
8ce0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
8cf0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
8d00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8d10: 20 20 20 20 69 66 28 20 7a 42 61 73 65 6e 61 6d      if( zBasenam
8d20: 65 21 3d 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  e!=zName ){.    
8d30: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 42 61    sqliteFree(zBa
8d40: 73 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  sename);.    }. 
8d50: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
8d60: 20 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20   zName;..    /* 
8d70: 47 65 74 20 74 68 65 20 74 79 70 65 6e 61 6d 65  Get the typename
8d80: 2c 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 2c  , type affinity,
8d90: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
8da0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 0a  equence for the.
8db0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20      ** column.. 
8dc0: 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
8dd0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
8de0: 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
8df0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65  pSrcList = pSele
8e00: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 7a 54  ct->pSrc;.    zT
8e10: 79 70 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ype = sqliteStrD
8e20: 75 70 28 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  up(columnType(&s
8e30: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
8e40: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70  ;.    pCol->zTyp
8e50: 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 20 20 70  e = zType;.    p
8e60: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8e70: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
8e80: 69 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c  ity(p);.    pCol
8e90: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
8ea0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8eb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
8ec0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
8ed0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 53 74  zColl = sqliteSt
8ee0: 72 44 75 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  rDup(pColl->zNam
8ef0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
8f00: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
8f10: 3b 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ;.  return pTab;
8f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
8f30: 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  e a SELECT state
8f40: 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
8f50: 69 6e 67 20 62 79 20 64 6f 69 6e 67 20 74 68 65  ing by doing the
8f60: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
8f70: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ings:.**.**    (
8f80: 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
8f90: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
8fa0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
8fb0: 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
8fc0: 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
8fd0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
8fe0: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
8ff0: 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
9000: 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
9010: 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
9020: 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
9030: 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
9040: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
9050: 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
9060: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
9070: 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
9080: 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
9090: 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
90a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
90b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
90c0: 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
90d0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
90e0: 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
90f0: 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
9100: 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
9110: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
9120: 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
9130: 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
9140: 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
9150: 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
9160: 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
9170: 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
9180: 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
9190: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
91a0: 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
91b0: 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
91c0: 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
91d0: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
91e0: 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
91f0: 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
9200: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
9210: 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
9220: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
9230: 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
9240: 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
9250: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
9260: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
9270: 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
9280: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
9290: 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
92a0: 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
92b0: 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
92c0: 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
92d0: 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
92e0: 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
92f0: 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
9300: 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
9310: 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
9320: 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
9330: 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
9340: 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  in TABLE..**.** 
9350: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
9360: 65 73 73 2e 20 20 49 66 20 74 68 65 72 65 20 61  ess.  If there a
9370: 72 65 20 70 72 6f 62 6c 65 6d 73 2c 20 6c 65 61  re problems, lea
9380: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
9390: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
93a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
93b0: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
93c0: 69 6e 74 20 70 72 65 70 53 65 6c 65 63 74 53 74  int prepSelectSt
93d0: 6d 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mt(Parse *pParse
93e0: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
93f0: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 72 63 3b  int i, j, k, rc;
9400: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
9410: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
9420: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
9430: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
9440: 2a 70 46 72 6f 6d 3b 0a 0a 20 20 69 66 28 20 70  *pFrom;..  if( p
9450: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
9460: 30 20 7c 7c 20 73 71 6c 69 74 65 33 4d 61 6c 6c  0 || sqlite3Mall
9470: 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
9480: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
9490: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
94a0: 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
94b0: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
94c0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
94d0: 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
94e0: 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
94f0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
9500: 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
9510: 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
9520: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
9530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
9540: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
9550: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
9560: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
9570: 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
9580: 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
9590: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
95a0: 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
95b0: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
95c0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
95d0: 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
95e0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
95f0: 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
9600: 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
9610: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
9620: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
9630: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
9640: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
9650: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
9660: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
9670: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
9680: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
9690: 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
96a0: 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
96b0: 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
96c0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
96d0: 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
96e0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
96f0: 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
9700: 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
9710: 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
9720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
9730: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
9740: 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
9750: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9760: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9770: 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
9780: 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
9790: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
97a0: 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
97b0: 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
97c0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
97d0: 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3d  ( pFrom->zAlias=
97e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
97f0: 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 3d 0a 20 20  rom->zAlias =.  
9800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
9810: 50 72 69 6e 74 66 28 22 73 71 6c 69 74 65 5f 73  Printf("sqlite_s
9820: 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76  ubquery_%p_", (v
9830: 6f 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c  oid*)pFrom->pSel
9840: 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ect);.      }.  
9850: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
9860: 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
9870: 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
9880: 3d 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20  = pTab = .      
9890: 20 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53    sqlite3ResultS
98a0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
98b0: 65 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  e, pFrom->zAlias
98c0: 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
98d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
98e0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
98f0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
9900: 7d 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  }.      /* The i
9910: 73 54 72 61 6e 73 69 65 6e 74 20 66 6c 61 67 20  sTransient flag 
9920: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
9930: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
9940: 72 65 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  re has been.    
9950: 20 20 2a 2a 20 64 79 6e 61 6d 69 63 61 6c 6c 79    ** dynamically
9960: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
9970: 61 79 20 62 65 20 66 72 65 65 64 20 61 74 20 61  ay be freed at a
9980: 6e 79 20 74 69 6d 65 2e 20 20 49 6e 20 6f 74 68  ny time.  In oth
9990: 65 72 20 77 6f 72 64 73 2c 0a 20 20 20 20 20 20  er words,.      
99a0: 2a 2a 20 70 54 61 62 20 69 73 20 6e 6f 74 20 70  ** pTab is not p
99b0: 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 70 65 72  ointing to a per
99c0: 73 69 73 74 65 6e 74 20 74 61 62 6c 65 20 73 74  sistent table st
99d0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
99e0: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 70 61  ines.      ** pa
99f0: 72 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  rt of the schema
9a00: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d  . */.      pTab-
9a10: 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 3d 20 31  >isTransient = 1
9a20: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9a30: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
9a40: 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
9a50: 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
9a60: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
9a70: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9a80: 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
9a90: 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
9aa0: 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
9ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
9ac0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
9ad0: 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46 72  pFrom->zName,pFr
9ae0: 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  om->zDatabase);.
9af0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
9b00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9b10: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
9b20: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
9b30: 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
9b40: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
9b50: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
9b60: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
9b70: 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20  * We reach here 
9b80: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  if the named tab
9b90: 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61  le is a really a
9ba0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20   view */.       
9bb0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
9bc0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
9bd0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
9be0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9bf0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
9c00: 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
9c10: 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
9c20: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
9c30: 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
9c40: 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
9c50: 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
9c60: 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
9c70: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
9c80: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
9c90: 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
9ca0: 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
9cb0: 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
9cc0: 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
9cd0: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
9ce0: 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
9cf0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
9d00: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
9d10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
9d20: 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
9d30: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
9d40: 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
9d50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9d60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9d70: 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  }..  /* Process 
9d80: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73  NATURAL keywords
9d90: 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49  , and ON and USI
9da0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f  NG clauses of jo
9db0: 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
9dc0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
9dd0: 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 20 72  n(pParse, p) ) r
9de0: 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46  eturn 1;..  /* F
9df0: 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
9e00: 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
9e10: 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
9e20: 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
9e30: 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
9e40: 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
9e50: 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
9e60: 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
9e70: 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
9e80: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
9e90: 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
9ea0: 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
9eb0: 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
9ec0: 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
9ed0: 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
9ee0: 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
9ef0: 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
9f00: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
9f10: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9f20: 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
9f30: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
9f40: 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
9f50: 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
9f60: 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
9f70: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
9f80: 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
9f90: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
9fa0: 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
9fb0: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
9fc0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
9fd0: 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
9fe0: 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
9ff0: 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
a000: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
a010: 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
a020: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45     Expr *pE = pE
a030: 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
a040: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
a050: 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
a060: 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
a070: 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e  ==TK_DOT && pE->
a080: 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52  pRight && pE->pR
a090: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
a0a0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d  .         && pE-
a0b0: 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c  >pLeft && pE->pL
a0c0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  eft->op==TK_ID )
a0d0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63   break;.  }.  rc
a0e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45   = 0;.  if( k<pE
a0f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
a100: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
a110: 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
a120: 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
a130: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
a140: 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
a150: 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
a160: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
a170: 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
a180: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
a190: 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
a1a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
a1b0: 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
a1c0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
a1d0: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
a1e0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
a1f0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
a200: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
a210: 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
a220: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
a230: 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
a240: 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
a250: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
a260: 6c 4e 61 6d 65 73 29 21 3d 30 20 26 26 0a 20 20  lNames)!=0 &&.  
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a280: 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
a290: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
a2a0: 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
a2b0: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
a2c0: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
a2d0: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
a2e0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
a2f0: 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
a300: 4c 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  L &&.           
a310: 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
a320: 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30  || pE->pRight==0
a330: 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   || pE->pRight->
a340: 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
a350: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
a360: 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
a370: 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
a380: 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
a390: 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
a3a0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
a3b0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a3c0: 6e 64 28 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  nd(pNew, a[k].pE
a3d0: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
a3e0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
a3f0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
a400: 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
a410: 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
a420: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a430: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
a440: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a450: 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20       a[k].pExpr 
a460: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b  = 0;.        a[k
a470: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
a480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a490: 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
a4a0: 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
a4b0: 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
a4c0: 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
a4d0: 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
a4e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
a4f0: 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
a500: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
a510: 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
a520: 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
a530: 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20  har *zTName;    
a540: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
a550: 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
a560: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
a570: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
a580: 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  & pE->pLeft ){. 
a590: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
a5a0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
a5b0: 6d 54 6f 6b 65 6e 28 26 70 45 2d 3e 70 4c 65 66  mToken(&pE->pLef
a5c0: 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
a5d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5e0: 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
a5f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a600: 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
a610: 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
a620: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
a630: 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
a640: 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
a650: 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
a660: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
a670: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
a680: 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
a690: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
a6a0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
a6b0: 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
a6c0: 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
a6d0: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
a6e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a6f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
a700: 6d 65 20 26 26 20 28 7a 54 61 62 4e 61 6d 65 3d  me && (zTabName=
a710: 3d 30 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30  =0 || zTabName[0
a720: 5d 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ]==0 || .       
a730: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a740: 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c  3StrICmp(zTName,
a750: 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 29 20 29   zTabName)!=0) )
a760: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
a770: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
a780: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 61    }.          ta
a790: 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  bleSeen = 1;.   
a7a0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
a7b0: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
a7c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
a7d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70 52  Expr *pExpr, *pR
a7e0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
a7f0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
a800: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
a810: 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
a820: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
a830: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
a840: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a850: 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69 73  pLeft = &pTabLis
a860: 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20 20  t->a[i-1];.     
a870: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c           if( (pL
a880: 65 66 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  eft->jointype & 
a890: 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 20 26  JT_NATURAL)!=0 &
a8a0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
a8b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
a8c0: 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e 70 54 61  Index(pLeft->pTa
a8d0: 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  b, zName)>=0 ){.
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
a900: 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
a910: 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
a920: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
a930: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f        ** table o
a940: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
a960: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
a970: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a980: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
a990: 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 4c  e3IdListIndex(pL
a9a0: 65 66 74 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  eft->pUsing, zNa
a9b0: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
a9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
a9d0: 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
a9e0: 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
a9f0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
aa20: 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
aa30: 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
aa60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aa70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aa80: 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
aa90: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
aaa0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
aab0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
aac0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
aad0: 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b 65           setToke
aae0: 6e 28 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  n(&pRight->token
aaf0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
ab00: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
ab10: 6d 65 20 26 26 20 28 6c 6f 6e 67 4e 61 6d 65 73  me && (longNames
ab20: 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
ab30: 72 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rc>1) ){.       
ab40: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
ab50: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
ab60: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29  (TK_ID, 0, 0, 0)
ab70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ab80: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
ab90: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  xpr(TK_DOT, pLef
aba0: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
abc0: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
abd0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
abe0: 20 73 65 74 54 6f 6b 65 6e 28 26 70 4c 65 66 74   setToken(&pLeft
abf0: 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d  ->token, zTabNam
ac00: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
ac10: 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70    setToken(&pExp
ac20: 72 2d 3e 73 70 61 6e 2c 20 73 71 6c 69 74 65 33  r->span, sqlite3
ac30: 4d 50 72 69 6e 74 66 28 22 25 73 2e 25 73 22 2c  MPrintf("%s.%s",
ac40: 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
ac50: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
ac60: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79    pExpr->span.dy
ac70: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
ac80: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
ac90: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  n.z = 0;.       
aca0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
acb0: 6b 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ken.n = 0;.     
acc0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
acd0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20  token.dyn = 0;. 
ace0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
acf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
ad00: 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
ad20: 78 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70  xpr->span = pExp
ad30: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  r->token;.      
ad40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ad50: 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
ad60: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
ad70: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
ad80: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ad90: 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
ada0: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
adb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
add0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
ade0: 69 73 74 41 70 70 65 6e 64 28 70 4e 65 77 2c 20  istAppend(pNew, 
adf0: 70 45 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e  pExpr, &pRight->
ae00: 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  token);.        
ae10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ae20: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
ae30: 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
ae40: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
ae50: 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
ae60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ae70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ae80: 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
ae90: 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
aea0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
aeb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
aec0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
aed0: 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
aee0: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
aef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
af00: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
af10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
af20: 69 74 65 46 72 65 65 28 7a 54 4e 61 6d 65 29 3b  iteFree(zTName);
af30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
af40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
af50: 73 74 44 65 6c 65 74 65 28 70 45 4c 69 73 74 29  stDelete(pEList)
af60: 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
af70: 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65  = pNew;.  }.  re
af80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
af90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
afa0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
afb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
afc0: 6e 65 20 61 73 73 6f 63 69 61 74 65 73 20 65 6e  ne associates en
afd0: 74 72 69 65 73 20 69 6e 20 61 6e 20 4f 52 44 45  tries in an ORDE
afe0: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
aff0: 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 63 6f 6c  list with.** col
b000: 75 6d 6e 73 20 69 6e 20 61 20 72 65 73 75 6c 74  umns in a result
b010: 2e 20 20 46 6f 72 20 65 61 63 68 20 4f 52 44 45  .  For each ORDE
b020: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 2c  R BY expression,
b030: 20 74 68 65 20 6f 70 63 6f 64 65 20 6f 66 0a 2a   the opcode of.*
b040: 2a 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  * the top-level 
b050: 6e 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  node is changed 
b060: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
b070: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 76 61 6c   the iColumn val
b080: 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 6f 70  ue of.** the top
b090: 2d 6c 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66  -level node is f
b0a0: 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 63 6f  illed in with co
b0b0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 61 6e 64 20  lumn number and 
b0c0: 74 68 65 20 69 54 61 62 6c 65 0a 2a 2a 20 76 61  the iTable.** va
b0d0: 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  lue of the top-l
b0e0: 65 76 65 6c 20 6e 6f 64 65 20 69 73 20 66 69 6c  evel node is fil
b0f0: 6c 65 64 20 77 69 74 68 20 69 54 61 62 6c 65 20  led with iTable 
b100: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
b110: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 70 72   If there are pr
b120: 69 6f 72 20 53 45 4c 45 43 54 20 63 6c 61 75 73  ior SELECT claus
b130: 65 73 2c 20 74 68 65 79 20 61 72 65 20 70 72 6f  es, they are pro
b140: 63 65 73 73 65 64 20 66 69 72 73 74 2e 20 20 41  cessed first.  A
b150: 20 6d 61 74 63 68 0a 2a 2a 20 69 6e 20 61 6e 20   match.** in an 
b160: 65 61 72 6c 69 65 72 20 53 45 4c 45 43 54 20 74  earlier SELECT t
b170: 61 6b 65 73 20 70 72 65 63 65 64 65 6e 63 65 20  akes precedence 
b180: 6f 76 65 72 20 61 20 6c 61 74 65 72 20 53 45 4c  over a later SEL
b190: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ECT..**.** Any e
b1a0: 6e 74 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e  ntry that does n
b1b0: 6f 74 20 6d 61 74 63 68 20 69 73 20 66 6c 61 67  ot match is flag
b1c0: 67 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2e  ged as an error.
b1d0: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
b1e0: 6f 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  of errors is ret
b1f0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
b200: 20 69 6e 74 20 6d 61 74 63 68 4f 72 64 65 72 62   int matchOrderb
b210: 79 54 6f 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72  yToColumn(.  Par
b220: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b230: 20 20 20 20 20 2f 2a 20 41 20 70 6c 61 63 65 20       /* A place 
b240: 74 6f 20 6c 65 61 76 65 20 65 72 72 6f 72 20 6d  to leave error m
b250: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
b260: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
b270: 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 6f       /* Match to
b280: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
b290: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
b2a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
b2b0: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
b2c0: 68 65 20 4f 52 44 45 52 20 42 59 20 76 61 6c 75  he ORDER BY valu
b2d0: 65 73 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69  es to match agai
b2e0: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  nst columns */. 
b2f0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
b300: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
b310: 72 74 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  rt this value in
b320: 20 69 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74   iTable */.  int
b330: 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 20 20   mustComplete   
b340: 20 20 20 20 20 2f 2a 20 49 66 20 54 52 55 45 20       /* If TRUE 
b350: 61 6c 6c 20 4f 52 44 45 52 20 42 59 73 20 6d 75  all ORDER BYs mu
b360: 73 74 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  st match */.){. 
b370: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
b380: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 45 78 70   int i, j;.  Exp
b390: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a  rList *pEList;..
b3a0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30    if( pSelect==0
b3b0: 20 7c 7c 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   || pOrderBy==0 
b3c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
b3d0: 28 20 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29  ( mustComplete )
b3e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
b3f0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
b400: 3b 20 69 2b 2b 29 7b 20 70 4f 72 64 65 72 42 79  ; i++){ pOrderBy
b410: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
b420: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65   }.  }.  if( pre
b430: 70 53 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72  pSelectStmt(pPar
b440: 73 65 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  se, pSelect) ){.
b450: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
b460: 7d 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  }.  if( pSelect-
b470: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
b480: 66 28 20 6d 61 74 63 68 4f 72 64 65 72 62 79 54  f( matchOrderbyT
b490: 6f 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  oColumn(pParse, 
b4a0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2c  pSelect->pPrior,
b4b0: 20 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c   pOrderBy, iTabl
b4c0: 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 72  e, 0) ){.      r
b4d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
b4e0: 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53   }.  pEList = pS
b4f0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
b500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
b510: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
b520: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
b530: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
b540: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20  .pExpr;.    int 
b550: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  iCol = -1;.    i
b560: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
b570: 5d 2e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ].done ) continu
b580: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
b590: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
b5a0: 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  pE, &iCol) ){.  
b5b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
b5c0: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
b5d0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
b5e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b5f0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b600: 20 20 20 22 4f 52 44 45 52 20 42 59 20 70 6f 73     "ORDER BY pos
b610: 69 74 69 6f 6e 20 25 64 20 73 68 6f 75 6c 64 20  ition %d should 
b620: 62 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  be between 1 and
b630: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
b640: 69 43 6f 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  iCol, pEList->nE
b650: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 45  xpr);.        nE
b660: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  rr++;.        br
b670: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b680: 20 20 20 69 66 28 20 21 6d 75 73 74 43 6f 6d 70     if( !mustComp
b690: 6c 65 74 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lete ) continue;
b6a0: 0a 20 20 20 20 20 20 69 43 6f 6c 2d 2d 3b 0a 20  .      iCol--;. 
b6b0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
b6c0: 3b 20 69 43 6f 6c 3c 30 20 26 26 20 6a 3c 70 45  ; iCol<0 && j<pE
b6d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
b6e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
b6f0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 20  ist->a[j].zName 
b700: 26 26 20 28 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  && (pE->op==TK_I
b710: 44 20 7c 7c 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f  D || pE->op==TK_
b720: 53 54 52 49 4e 47 29 20 29 7b 0a 20 20 20 20 20  STRING) ){.     
b730: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
b740: 2a 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20  *zLabel;.       
b750: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
b760: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
b770: 20 20 20 20 20 7a 4c 61 62 65 6c 20 3d 20 73 71       zLabel = sq
b780: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
b790: 65 6e 28 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  en(&pE->token);.
b7a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b7b0: 7a 4c 61 62 65 6c 21 3d 30 20 29 3b 0a 20 20 20  zLabel!=0 );.   
b7c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b7d0: 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 7a  StrICmp(zName, z
b7e0: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 20 0a 20 20  Label)==0 ){ .  
b7f0: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6a          iCol = j
b800: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b810: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
b820: 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  Label);.      }.
b830: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
b840: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
b850: 6f 6d 70 61 72 65 28 70 45 2c 20 70 45 4c 69 73  ompare(pE, pELis
b860: 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 20 29  t->a[j].pExpr) )
b870: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
b880: 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
b890: 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  }.    if( iCol>=
b8a0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 2d 3e 6f  0 ){.      pE->o
b8b0: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
b8c0: 20 20 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e       pE->iColumn
b8d0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70   = iCol;.      p
b8e0: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  E->iTable = iTab
b8f0: 6c 65 3b 0a 20 20 20 20 20 20 70 45 2d 3e 69 41  le;.      pE->iA
b900: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  gg = -1;.      p
b910: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
b920: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ne = 1;.    }.  
b930: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 26 26 20    if( iCol<0 && 
b940: 6d 75 73 74 43 6f 6d 70 6c 65 74 65 20 29 7b 0a  mustComplete ){.
b950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
b960: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
b970: 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20        "ORDER BY 
b980: 74 65 72 6d 20 6e 75 6d 62 65 72 20 25 64 20 64  term number %d d
b990: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
b9a0: 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 22  y result column"
b9b0: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 6e 45  , i+1);.      nE
b9c0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61  rr++;.      brea
b9d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
b9e0: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
b9f0: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
ba00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
ba10: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
ba20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
ba30: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
ba40: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
ba50: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
ba60: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
ba70: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ba80: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
ba90: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
baa0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
bab0: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
bac0: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
bad0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
bae0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
baf0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
bb00: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
bb10: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
bb20: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
bb30: 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  arse->db);.  }. 
bb40: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
bb50: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
bb60: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
bb70: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
bb80: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
bb90: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
bba0: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
bbb0: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
bbc0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
bbd0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
bbe0: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
bbf0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
bc00: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
bc10: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
bc20: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
bc30: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
bc40: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
bc50: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
bc60: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
bc70: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
bc80: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
bc90: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
bca0: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
bcb0: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
bcc0: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
bcd0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
bce0: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
bcf0: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
bd00: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
bd10: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
bd20: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
bd30: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
bd40: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
bd50: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
bd60: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
bd70: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
bd80: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
bd90: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
bda0: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
bdb0: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
bdc0: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
bdd0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
bde0: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28  ault values.** (
bdf0: 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20  usually but not 
be00: 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72  always -1) prior
be10: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
be20: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c   routine..** Onl
be30: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
be40: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
be50: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
be60: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
be70: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
be80: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
be90: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
bea0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
beb0: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
bec0: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
bed0: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
bee0: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
bef0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bf00: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
bf10: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
bf20: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
bf30: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
bf40: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
bf50: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
bf60: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
bf70: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
bf80: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
bf90: 72 32 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r2;..  /* .  ** 
bfa0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
bfb0: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
bfc0: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
bfd0: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
bfe0: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
bff0: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
c000: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
c010: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
c020: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
c030: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
c040: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
c050: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  o rows..  */.  i
c060: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
c070: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
c080: 69 4c 69 6d 69 74 20 3d 20 70 50 61 72 73 65 2d  iLimit = pParse-
c090: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 50 61 72 73  >nMem;.    pPars
c0a0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20  e->nMem += 2;.  
c0b0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c0c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c0d0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
c0e0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
c0f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c100: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
c110: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c120: 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  p(v, OP_MustBeIn
c130: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  t, 0, 0);.    sq
c140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c150: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 69  , OP_MemStore, i
c160: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 56  Limit, 0);.    V
c170: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c180: 23 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22  # LIMIT counter"
c190: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
c1a0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c1b0: 66 4d 65 6d 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fMemZero, iLimit
c1c0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20  , iBreak);.  }. 
c1d0: 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
c1e0: 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  ){.    p->iOffse
c1f0: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 70 50  t = iOffset = pP
c200: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
c210: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c220: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c230: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
c240: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
c250: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c260: 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
c270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c280: 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  Op(v, OP_MustBeI
c290: 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nt, 0, 0);.    s
c2a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c2b0: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
c2c0: 69 4f 66 66 73 65 74 2c 20 70 2d 3e 70 4c 69 6d  iOffset, p->pLim
c2d0: 69 74 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  it==0);.    Vdbe
c2e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 4f  Comment((v, "# O
c2f0: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
c300: 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
c310: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c320: 2c 20 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69  , OP_IfMemPos, i
c330: 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
c340: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c350: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
c360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c370: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
c380: 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  teger, 0, 0);.  
c390: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c3a0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
c3b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
c3c0: 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  it ){.      sqli
c3d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c3e0: 4f 50 5f 41 64 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_Add, 0, 0);. 
c3f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c400: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
c410: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
c420: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c430: 66 4d 65 6d 50 6f 73 2c 20 69 4c 69 6d 69 74 2c  fMemPos, iLimit,
c440: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
c450: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c460: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
c470: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c480: 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 2d  (v, OP_MemInt, -
c490: 31 2c 20 69 4c 69 6d 69 74 2b 31 29 3b 0a 20 20  1, iLimit+1);.  
c4a0: 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
c4b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c4c0: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
c4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c4e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
c4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c500: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
c510: 74 6f 72 65 2c 20 69 4c 69 6d 69 74 2b 31 2c 20  tore, iLimit+1, 
c520: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  1);.    VdbeComm
c530: 65 6e 74 28 28 76 2c 20 22 23 20 4c 49 4d 49 54  ent((v, "# LIMIT
c540: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
c550: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c560: 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20  ere(v, addr2);. 
c570: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
c580: 63 61 74 65 20 61 20 76 69 72 74 75 61 6c 20 69  cate a virtual i
c590: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
c5a0: 73 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  sorting..*/.stat
c5b0: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53 6f  ic void createSo
c5c0: 72 74 69 6e 67 49 6e 64 65 78 28 50 61 72 73 65  rtingIndex(Parse
c5d0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
c5e0: 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70   *p, ExprList *p
c5f0: 4f 72 64 65 72 42 79 29 7b 0a 20 20 69 66 28 20  OrderBy){.  if( 
c600: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c610: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 73  int addr;.    as
c620: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e  sert( pOrderBy->
c630: 69 45 43 75 72 73 6f 72 3d 3d 30 20 29 3b 0a 20  iECursor==0 );. 
c640: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
c650: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
c660: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 61 64 64 72  nTab++;.    addr
c670: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c680: 64 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  dOp(pParse->pVdb
c690: 65 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  e, OP_OpenVirtua
c6a0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c6c0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
c6d0: 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
c6e0: 70 72 2b 31 29 3b 0a 20 20 20 20 61 73 73 65 72  pr+1);.    asser
c6f0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69  t( p->addrOpenVi
c700: 72 74 5b 32 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  rt[2] == -1 );. 
c710: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
c720: 72 74 5b 32 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[2] = addr;.  
c730: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f  }.}../*.** The o
c740: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 73  pcode at addr is
c750: 20 61 6e 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75   an OP_OpenVirtu
c760: 61 6c 20 74 68 61 74 20 63 72 65 61 74 65 64 20  al that created 
c770: 61 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 69 6e 64  a sorting.** ind
c780: 65 78 20 74 68 61 20 77 65 20 65 6e 64 65 64 20  ex tha we ended 
c790: 75 70 20 6e 6f 74 20 6e 65 65 64 69 6e 67 2e 20  up not needing. 
c7a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
c7b0: 61 6e 67 65 73 20 74 68 61 74 0a 2a 2a 20 6f 70  anges that.** op
c7c0: 63 6f 64 65 20 74 6f 20 4f 50 5f 4e 6f 6f 70 2e  code to OP_Noop.
c7d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7e0: 75 6e 63 72 65 61 74 65 53 6f 72 74 69 6e 67 49  uncreateSortingI
c7f0: 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
c800: 73 65 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  se, int addr){. 
c810: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c820: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 56 64 62 65  e->pVdbe;.  Vdbe
c830: 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65  Op *pOp = sqlite
c840: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
c850: 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr);.  sqlite3Vd
c860: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
c870: 64 72 2c 20 30 2c 20 30 29 3b 0a 20 20 70 4f 70  dr, 0, 0);.  pOp
c880: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f  ->opcode = OP_No
c890: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20  op;.  pOp->p1 = 
c8a0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 30  0;.  pOp->p2 = 0
c8b0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
c8c0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
c8d0: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
c8e0: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
c8f0: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
c900: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
c910: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
c920: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
c930: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
c940: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
c950: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
c960: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
c970: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
c980: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
c990: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
c9a0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
c9b0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
c9c0: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
c9d0: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
c9e0: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
c9f0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
ca00: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
ca10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
ca20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
ca30: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
ca40: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
ca50: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
ca60: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
ca70: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
ca80: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
ca90: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
caa0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
cab0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
cac0: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
cad0: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
cae0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
caf0: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
cb00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
cb10: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
cb20: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
cb30: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
cb40: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
cb50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
cb60: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
cb70: 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  T */..#ifndef SQ
cb80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
cb90: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
cba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cbb0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
cbc0: 73 20 61 20 71 75 65 72 79 20 74 68 61 74 20 69  s a query that i
cbd0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 75 6e 69  s really the uni
cbe0: 6f 6e 0a 2a 2a 20 6f 72 20 69 6e 74 65 72 73 65  on.** or interse
cbf0: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6f 72 20  ction of two or 
cc00: 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
cc10: 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 22 70 22  eries..**.** "p"
cc20: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
cc30: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
cc40: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
cc50: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
cc60: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
cc70: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
cc80: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
cc90: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
cca0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
ccb0: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
ccc0: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
ccd0: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
cce0: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
ccf0: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
cd00: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
cd10: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
cd20: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
cd30: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
cd40: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
cd50: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
cd60: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
cd70: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
cd80: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
cd90: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
cda0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
cdb0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
cdc0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
cdd0: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
cde0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
cdf0: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
ce00: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
ce10: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
ce20: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
ce30: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
ce40: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
ce70: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
ce80: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
ce90: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
cea0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
ceb0: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
cec0: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
ced0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
cee0: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
cef0: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
cf00: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
cf10: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
cf20: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
cf30: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
cf40: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
cf50: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
cf60: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
cf70: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
cf80: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
cf90: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
cfa0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
cfb0: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
cfc0: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
cfd0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
cfe0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
cff0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
d000: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d010: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d020: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
d030: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
d040: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
d050: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
d060: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
d070: 20 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20    int eDest,    
d080: 20 20 20 20 20 20 20 20 2f 2a 20 5c 5f 5f 5f 20          /* \___ 
d090: 20 53 74 6f 72 65 20 71 75 65 72 79 20 72 65 73   Store query res
d0a0: 75 6c 74 73 20 61 73 20 73 70 65 63 69 66 69 65  ults as specifie
d0b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  d */.  int iParm
d0c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d0d0: 2f 20 20 20 20 20 62 79 20 74 68 65 73 65 20 74  /     by these t
d0e0: 77 6f 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  wo parameters.  
d0f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 63 68 61 72         */.  char
d100: 20 2a 61 66 66 20 20 20 20 20 20 20 20 20 20 20   *aff           
d110: 20 20 2f 2a 20 49 66 20 65 44 65 73 74 20 69 73    /* If eDest is
d120: 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 68 65 20   SRT_Union, the 
d130: 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
d140: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
d150: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
d160: 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
d170: 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
d180: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
d190: 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
d1a0: 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
d1b0: 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
d1c0: 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
d1d0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
d1e0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
d1f0: 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
d200: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
d210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d220: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
d230: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d240: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d250: 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
d260: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
d270: 65 20 6f 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20  e on p */.  int 
d280: 61 53 65 74 50 32 5b 32 5d 3b 20 20 20 20 20 20  aSetP2[2];      
d290: 20 20 2f 2a 20 53 65 74 20 50 32 20 76 61 6c 75    /* Set P2 valu
d2a0: 65 20 6f 66 20 74 68 65 73 65 20 6f 70 20 74 6f  e of these op to
d2b0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
d2c0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 74  ns */.  int nSet
d2d0: 50 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  P2 = 0;       /*
d2e0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
d2f0: 20 69 6e 20 61 53 65 74 50 32 5b 5d 20 75 73 65   in aSetP2[] use
d300: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  d */..  /* Make 
d310: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
d320: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
d330: 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69  IT clause on pri
d340: 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c  or SELECTs.  Onl
d350: 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20  y.  ** the last 
d360: 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c  (right-most) SEL
d370: 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65  ECT in the serie
d380: 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52  s may have an OR
d390: 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e  DER BY or LIMIT.
d3a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30  .  */.  if( p==0
d3b0: 20 7c 7c 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   || p->pPrior==0
d3c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
d3d0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
d3e0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
d3f0: 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
d400: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
d410: 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
d420: 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
d430: 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
d440: 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
d450: 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 69 66  ightmost );.  if
d460: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
d470: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
d480: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d490: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
d4a0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d4b0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d4c0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d4d0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d4e0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d4f0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d500: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
d510: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
d520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d530: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
d540: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
d550: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
d560: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
d570: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
d580: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
d590: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
d5a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
d5b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d5c0: 73 75 72 65 20 77 65 20 68 61 76 65 20 61 20 76  sure we have a v
d5d0: 61 6c 69 64 20 71 75 65 72 79 20 65 6e 67 69 6e  alid query engin
d5e0: 65 2e 20 20 49 66 20 6e 6f 74 2c 20 63 72 65 61  e.  If not, crea
d5f0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
d600: 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
d610: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d620: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
d630: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
d640: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
d650: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _end;.  }..  /* 
d660: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
d670: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
d680: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
d690: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ary.  */.  if( e
d6a0: 44 65 73 74 3d 3d 53 52 54 5f 56 69 72 74 75 61  Dest==SRT_Virtua
d6b0: 6c 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  lTab ){.    asse
d6c0: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d6d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 65  .    assert( nSe
d6e0: 74 50 32 3c 73 69 7a 65 6f 66 28 61 53 65 74 50  tP2<sizeof(aSetP
d6f0: 32 29 2f 73 69 7a 65 6f 66 28 61 53 65 74 50 32  2)/sizeof(aSetP2
d700: 5b 30 5d 29 20 29 3b 0a 20 20 20 20 61 53 65 74  [0]) );.    aSet
d710: 50 32 5b 6e 53 65 74 50 32 2b 2b 5d 20 3d 20 73  P2[nSetP2++] = s
d720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d730: 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61  v, OP_OpenVirtua
d740: 6c 2c 20 69 50 61 72 6d 2c 20 30 29 3b 0a 20 20  l, iParm, 0);.  
d750: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61    eDest = SRT_Ta
d760: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ble;.  }..  /* G
d770: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
d780: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
d790: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
d7a0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 4f  ments..  */.  pO
d7b0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
d7c0: 65 72 42 79 3b 0a 20 20 73 77 69 74 63 68 28 20  erBy;.  switch( 
d7d0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
d7e0: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
d7f0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
d800: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
d810: 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
d820: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
d830: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
d840: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
d850: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
d860: 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72  ;.        pPrior
d870: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70  ->pOffset = p->p
d880: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
d890: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d8a0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d8b0: 72 2c 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c  r, eDest, iParm,
d8c0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
d8d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
d8e0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
d8f0: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
d900: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
d910: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
d920: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d930: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d940: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d950: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  0;.        p->iL
d960: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
d970: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70  Limit;.        p
d980: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
d990: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
d9a0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
d9b0: 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it>=0 ){.       
d9c0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d9d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d9e0: 5f 49 66 4d 65 6d 5a 65 72 6f 2c 20 70 2d 3e 69  _IfMemZero, p->i
d9f0: 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  Limit, 0);.     
da00: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
da10: 28 28 76 2c 20 22 23 20 4a 75 6d 70 20 61 68 65  ((v, "# Jump ahe
da20: 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
da30: 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
da40: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
da50: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
da60: 72 73 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69  rse, p, eDest, i
da70: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 61  Parm, 0, 0, 0, a
da80: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ff);.        p->
da90: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
daa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
dab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
dac0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
dad0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
dae0: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
daf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
db00: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
db10: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
db20: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
db30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
db40: 20 2f 2a 20 46 6f 72 20 55 4e 49 4f 4e 20 41 4c   /* For UNION AL
db50: 4c 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 66  L ... ORDER BY f
db60: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
db70: 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  he next case */.
db80: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
db90: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
dba0: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
dbb0: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
dbc0: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
dbd0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
dbe0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
dbf0: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
dc00: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30        int op = 0
dc10: 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;      /* One of
dc20: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
dc30: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
dc40: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
dc50: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
dc60: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
dc70: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
dc80: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
dc90: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
dca0: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
dcb0: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
dcc0: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
dcd0: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
dce0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
dcf0: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
dd00: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 3f   p->op==TK_ALL ?
dd10: 20 53 52 54 5f 54 61 62 6c 65 20 3a 20 53 52 54   SRT_Table : SRT
dd20: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
dd30: 28 20 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  ( eDest==priorOp
dd40: 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
dd50: 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  && !p->pLimit &&
dd60: 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a   !p->pOffset ){.
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
dd80: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
dd90: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
dda0: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
ddb0: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
ddc0: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
ddd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
dde0: 6e 54 61 62 20 3d 20 69 50 61 72 6d 3b 0a 20 20  nTab = iParm;.  
ddf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de00: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
de10: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
de20: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
de30: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
de40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
de50: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
de60: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
de70: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
de80: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
de90: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
dea0: 65 72 42 79 20 26 26 20 6d 61 74 63 68 4f 72 64  erBy && matchOrd
deb0: 65 72 62 79 54 6f 43 6f 6c 75 6d 6e 28 70 50 61  erbyToColumn(pPa
dec0: 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72 42 79  rse, p, pOrderBy
ded0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 31 29 20 29 7b  , unionTab,1) ){
dee0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
def0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
df00: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
df10: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
df20: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
df30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
df40: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
df50: 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
df60: 20 20 20 20 20 20 20 69 66 28 20 70 72 69 6f 72         if( prior
df70: 4f 70 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  Op==SRT_Table ){
df80: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
df90: 74 28 20 6e 53 65 74 50 32 3c 73 69 7a 65 6f 66  t( nSetP2<sizeof
dfa0: 28 61 53 65 74 50 32 29 2f 73 69 7a 65 6f 66 28  (aSetP2)/sizeof(
dfb0: 61 53 65 74 50 32 5b 30 5d 29 20 29 3b 0a 20 20  aSetP2[0]) );.  
dfc0: 20 20 20 20 20 20 20 20 61 53 65 74 50 32 5b 6e          aSetP2[n
dfd0: 53 65 74 50 32 2b 2b 5d 20 3d 20 61 64 64 72 3b  SetP2++] = addr;
dfe0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dff0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e000: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
e010: 74 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  t[0] == -1 );.  
e020: 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
e030: 70 65 6e 56 69 72 74 5b 30 5d 20 3d 20 61 64 64  penVirt[0] = add
e040: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  r;.          p->
e050: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 75 73 65 73  pRightmost->uses
e060: 56 69 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Virt = 1;.      
e070: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 72 65 61    }.        crea
e080: 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 70  teSortingIndex(p
e090: 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64 65 72  Parse, p, pOrder
e0a0: 42 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  By);.        ass
e0b0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
e0c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
e0d0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
e0e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
e0f0: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
e100: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e110: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
e120: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 72 63 20  rBy );.      rc 
e130: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e140: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
e150: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
e160: 62 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  b, 0, 0, 0, aff)
e170: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
e180: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
e190: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
e1a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e1b0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
e1c0: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
e1d0: 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
e1e0: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
e1f0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 63 61  p ){.         ca
e200: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 6f  se TK_EXCEPT:  o
e210: 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 20  p = SRT_Except; 
e220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e230: 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
e240: 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f     op = SRT_Unio
e250: 6e 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  n;    break;.   
e260: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c        case TK_AL
e270: 4c 3a 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f  L:     op = SRT_
e280: 54 61 62 6c 65 3b 20 20 20 20 62 72 65 61 6b 3b  Table;    break;
e290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e2a0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
e2b0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
e2c0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  = 0;.      p->di
e2d0: 73 61 6c 6c 6f 77 4f 72 64 65 72 42 79 20 3d 20  sallowOrderBy = 
e2e0: 70 4f 72 64 65 72 42 79 21 3d 30 3b 0a 20 20 20  pOrderBy!=0;.   
e2f0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
e300: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
e310: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
e320: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
e330: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
e340: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
e350: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e360: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
e370: 2c 20 6f 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  , op, unionTab, 
e380: 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a 20  0, 0, 0, aff);. 
e390: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
e3a0: 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
e3b0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
e3c0: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 73 71 6c  derBy;.      sql
e3d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
e3e0: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
e3f0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
e400: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
e410: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
e420: 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
e430: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
e440: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
e450: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
e460: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
e470: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
e480: 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20     }...      /* 
e490: 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
e4a0: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
e4b0: 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
e4c0: 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
e4d0: 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77   ** it is that w
e4e0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64  e currently need
e4f0: 2e 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20  ..      */      
e500: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
e510: 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69  !=priorOp || uni
e520: 6f 6e 54 61 62 21 3d 69 50 61 72 6d 20 29 7b 0a  onTab!=iParm ){.
e530: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
e540: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
e550: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
e560: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
e570: 20 20 20 20 20 20 20 20 69 66 28 20 65 44 65 73          if( eDes
e580: 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
e590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  ){.          gen
e5a0: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
e5b0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 70  (pParse, 0, p->p
e5c0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
e5d0: 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
e5e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
e5f0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
e600: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
e610: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e620: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
e630: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
e640: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
e650: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
e660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e670: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e  v, OP_Rewind, un
e680: 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b  ionTab, iBreak);
e690: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
e6a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e6b0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
e6c0: 20 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74       rc = select
e6d0: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
e6e0: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
e6f0: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
e700: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
e730: 79 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50  y, -1, eDest, iP
e740: 61 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  arm, .          
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b     iCont, iBreak
e770: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
e780: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
e790: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
e7a0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e7b0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
e7c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e7d0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
e7e0: 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
e7f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
e810: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
e820: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
e830: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e840: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
e850: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
e860: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e870: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
e880: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
e890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e8a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
e8b0: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
e8c0: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
e8d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
e8e0: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
e8f0: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
e900: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
e910: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
e920: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
e930: 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
e940: 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
e950: 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
e960: 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
e970: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e980: 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
e990: 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
e9a0: 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
e9b0: 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
e9c0: 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
e9d0: 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
e9e0: 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
e9f0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
ea00: 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
ea10: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
ea20: 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 6d  f( pOrderBy && m
ea30: 61 74 63 68 4f 72 64 65 72 62 79 54 6f 43 6f 6c  atchOrderbyToCol
ea40: 75 6d 6e 28 70 50 61 72 73 65 2c 70 2c 70 4f 72  umn(pParse,p,pOr
ea50: 64 65 72 42 79 2c 74 61 62 31 2c 31 29 20 29 7b  derBy,tab1,1) ){
ea60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
ea70: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
ea80: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ea90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 72        }.      cr
eaa0: 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
eab0: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 72 64  (pParse, p, pOrd
eac0: 65 72 42 79 29 3b 0a 0a 20 20 20 20 20 20 61 64  erBy);..      ad
ead0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
eae0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
eaf0: 56 69 72 74 75 61 6c 2c 20 74 61 62 31 2c 20 30  Virtual, tab1, 0
eb00: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
eb10: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72 74   p->addrOpenVirt
eb20: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
eb30: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69     p->addrOpenVi
eb40: 72 74 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  rt[0] = addr;.  
eb50: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
eb60: 74 2d 3e 75 73 65 73 56 69 72 74 20 3d 20 31 3b  t->usesVirt = 1;
eb70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
eb80: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
eb90: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
eba0: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
ebb0: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
ebc0: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
ebd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
ebe0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ebf0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
ec00: 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
ec10: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29  1, 0, 0, 0, aff)
ec20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
ec30: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
ec40: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
ec50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ec60: 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
ec70: 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
ec80: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ec90: 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
eca0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
ecb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ecc0: 20 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c   OP_OpenVirtual,
ecd0: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
ece0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
ecf0: 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 3d 20 2d  OpenVirt[1] == -
ed00: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
ed10: 64 72 4f 70 65 6e 56 69 72 74 5b 31 5d 20 3d 20  drOpenVirt[1] = 
ed20: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
ed30: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
ed40: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
ed50: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
ed60: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
ed70: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
ed80: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
ed90: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
eda0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
edb0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
edc0: 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 32 2c  SRT_Union, tab2,
edd0: 20 30 2c 20 30 2c 20 30 2c 20 61 66 66 29 3b 0a   0, 0, 0, aff);.
ede0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
edf0: 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
ee00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
ee10: 65 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  e(p->pLimit);.  
ee20: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
ee30: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
ee40: 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
ee50: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  et;.      if( rc
ee60: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
ee70: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
ee80: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
ee90: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
eea0: 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
eeb0: 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
eec0: 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
eed0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  .      ** tables
eee0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
eef0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
ef00: 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  st );.      if( 
ef10: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
ef20: 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ack ){.        g
ef30: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ef40: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 2d  es(pParse, 0, p-
ef50: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
ef60: 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  }.      iBreak =
ef70: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ef80: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ef90: 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
efa0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
efb0: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
efc0: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
efd0: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
efe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eff0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
f000: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
f010: 61 6b 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  ak);.      iStar
f020: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
f030: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  ddOp(v, OP_RowKe
f040: 79 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  y, tab1, 0);.   
f050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f060: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  dOp(v, OP_NotFou
f070: 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 29  nd, tab2, iCont)
f080: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 6c  ;.      rc = sel
f090: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
f0a0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
f0b0: 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
f0c0: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
f0f0: 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20 69 50 61  , -1, eDest, iPa
f100: 72 6d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm, .           
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c    iCont, iBreak,
f130: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
f140: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  c ){.        rc 
f150: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
f160: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f170: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
f180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f190: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
f1a0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
f1b0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
f1c0: 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
f1d0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
f1e0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f1f0: 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
f200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f210: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
f220: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
f230: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f240: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73  AddOp(v, OP_Clos
f250: 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
f260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f270: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
f280: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
f290: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
f2a0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
f2b0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
f2c0: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
f2d0: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
f2e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
f2f0: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
f300: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
f310: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
f320: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
f330: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
f340: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f350: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
f360: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
f370: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
f380: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
f390: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
f3a0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
f3b0: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
f3c0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
f3d0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
f3e0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
f3f0: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  d;.  }..  /* Set
f400: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
f410: 6f 6c 75 6d 6e 73 20 69 6e 20 74 65 6d 70 6f 72  olumns in tempor
f420: 61 72 79 20 74 61 62 6c 65 73 0a 20 20 2a 2f 0a  ary tables.  */.
f430: 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
f440: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 77 68 69  st->nExpr;.  whi
f450: 6c 65 28 20 6e 53 65 74 50 32 20 29 7b 0a 20 20  le( nSetP2 ){.  
f460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f470: 6e 67 65 50 32 28 76 2c 20 61 53 65 74 50 32 5b  ngeP2(v, aSetP2[
f480: 2d 2d 6e 53 65 74 50 32 5d 2c 20 6e 43 6f 6c 29  --nSetP2], nCol)
f490: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
f4a0: 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
f4b0: 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
f4c0: 65 69 74 68 65 72 20 74 68 65 20 4f 52 44 45 52  either the ORDER
f4d0: 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 20 20   BY clause or.  
f4e0: 2a 2a 20 62 79 20 61 6e 79 20 74 65 6d 70 6f 72  ** by any tempor
f4f0: 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
f500: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
f510: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
f520: 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
f530: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
f540: 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
f550: 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20  porary tables.  
f560: 49 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  Invoke the.  ** 
f570: 4f 52 44 45 52 20 42 59 20 70 72 6f 63 65 73 73  ORDER BY process
f580: 69 6e 67 20 69 66 20 74 68 65 72 65 20 69 73 20  ing if there is 
f590: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
f5a0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
f5b0: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
f5c0: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
f5d0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
f5e0: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
f5f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f600: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
f610: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
f620: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
f630: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
f640: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
f650: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
f660: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
f670: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
f680: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
f690: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
f6a0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
f6b0: 79 20 7c 7c 20 70 2d 3e 75 73 65 73 56 69 72 74  y || p->usesVirt
f6c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f6f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
f700: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
f710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f720: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f730: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
f740: 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
f750: 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
f760: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
f770: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
f780: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f790: 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
f7a0: 20 2a 2a 61 70 43 6f 6c 6c 3b 0a 20 20 20 20 43   **apColl;.    C
f7b0: 6f 6c 6c 53 65 71 20 2a 2a 61 43 6f 70 79 3b 0a  ollSeq **aCopy;.
f7c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
f7d0: 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b  pRightmost==p );
f7e0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
f7f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
f800: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e  eof(*pKeyInfo)+n
f810: 43 6f 6c 2a 32 2a 73 69 7a 65 6f 66 28 43 6f 6c  Col*2*sizeof(Col
f820: 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 29 3b 0a  lSeq*) + nCol);.
f830: 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
f840: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
f850: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f860: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f870: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
f880: 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
f890: 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
f8a0: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49  ->db);.    pKeyI
f8b0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 43  nfo->nField = nC
f8c0: 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ol;..    for(i=0
f8d0: 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
f8e0: 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
f8f0: 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
f900: 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
f910: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
f920: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
f930: 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
f940: 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
f950: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 70 50      *apColl = pP
f960: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
f970: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
f980: 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
f990: 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
f9a0: 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
f9b0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
f9c0: 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
f9d0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
f9e0: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69  Loop->addrOpenVi
f9f0: 72 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  rt[i];.        i
fa00: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
fa10: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
fa20: 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
fa30: 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
fa40: 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
fa50: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
fa60: 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
fa70: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
fa80: 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
fa90: 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
faa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
fab0: 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69  Loop->addrOpenVi
fac0: 72 74 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  rt[1]<0 );.     
fad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
faf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
fb00: 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
fb10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fb20: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
fb30: 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
fb40: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
fb50: 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
fb60: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64   }..    if( pOrd
fb70: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74  erBy ){.      st
fb80: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
fb90: 65 6d 20 2a 70 4f 54 65 72 6d 20 3d 20 70 4f 72  em *pOTerm = pOr
fba0: 64 65 72 42 79 2d 3e 61 3b 0a 20 20 20 20 20 20  derBy->a;.      
fbb0: 69 6e 74 20 6e 4f 72 64 65 72 42 79 45 78 70 72  int nOrderByExpr
fbc0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
fbd0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  pr;.      int ad
fbe0: 64 72 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 53  dr;.      u8 *pS
fbf0: 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 20 20 20  ortOrder;..     
fc00: 20 61 43 6f 70 79 20 3d 20 26 70 4b 65 79 49 6e   aCopy = &pKeyIn
fc10: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 3b  fo->aColl[nCol];
fc20: 0a 20 20 20 20 20 20 70 53 6f 72 74 4f 72 64 65  .      pSortOrde
fc30: 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  r = pKeyInfo->aS
fc40: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
fc50: 26 61 43 6f 70 79 5b 6e 43 6f 6c 5d 3b 0a 20 20  &aCopy[nCol];.  
fc60: 20 20 20 20 6d 65 6d 63 70 79 28 61 43 6f 70 79      memcpy(aCopy
fc70: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
fc80: 6c 2c 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 43  l, nCol*sizeof(C
fc90: 6f 6c 6c 53 65 71 2a 29 29 3b 0a 20 20 20 20 20  ollSeq*));.     
fca0: 20 61 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   apColl = pKeyIn
fcb0: 66 6f 2d 3e 61 43 6f 6c 6c 3b 0a 20 20 20 20 20  fo->aColl;.     
fcc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
fcd0: 65 72 42 79 45 78 70 72 3b 20 69 2b 2b 2c 20 70  erByExpr; i++, p
fce0: 4f 54 65 72 6d 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  OTerm++, apColl+
fcf0: 2b 2c 20 70 53 6f 72 74 4f 72 64 65 72 2b 2b 29  +, pSortOrder++)
fd00: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
fd10: 70 45 78 70 72 20 3d 20 70 4f 54 65 72 6d 2d 3e  pExpr = pOTerm->
fd20: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 63  pExpr;.        c
fd30: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4f 54  har *zName = pOT
fd40: 65 72 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  erm->zName;.    
fd50: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
fd60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
fd70: 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
fd80: 6d 6e 3c 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  mn<nCol );.     
fd90: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
fda0: 20 20 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c            *apCol
fdb0: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
fdc0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
fdd0: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20   zName, -1);.   
fde0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fdf0: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
fe00: 61 43 6f 70 79 5b 70 45 78 70 72 2d 3e 69 43 6f  aCopy[pExpr->iCo
fe10: 6c 75 6d 6e 5d 3b 0a 20 20 20 20 20 20 20 20 7d  lumn];.        }
fe20: 0a 20 20 20 20 20 20 20 20 2a 70 53 6f 72 74 4f  .        *pSortO
fe30: 72 64 65 72 20 3d 20 70 4f 54 65 72 6d 2d 3e 73  rder = pOTerm->s
fe40: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
fe50: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
fe60: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
fe70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
fe80: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 56 69 72  ( p->addrOpenVir
fe90: 74 5b 32 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t[2]>=0 );.     
fea0: 20 61 64 64 72 20 3d 20 70 2d 3e 61 64 64 72 4f   addr = p->addrO
feb0: 70 65 6e 56 69 72 74 5b 32 5d 3b 0a 20 20 20 20  penVirt[2];.    
fec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fed0: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 70  ngeP2(v, addr, p
fee0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  ->pEList->nExpr+
fef0: 32 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  2);.      pKeyIn
ff00: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72  fo->nField = nOr
ff10: 64 65 72 42 79 45 78 70 72 3b 0a 20 20 20 20 20  derByExpr;.     
ff20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ff30: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 63  geP3(v, addr, (c
ff40: 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
ff50: 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
ff60: 46 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  F);.      pKeyIn
ff70: 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 65  fo = 0;.      ge
ff80: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
ff90: 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 2d 3e  Parse, p, v, p->
ffa0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65  pEList->nExpr, e
ffb0: 44 65 73 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20  Dest, iParm);.  
ffc0: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 46    }..    sqliteF
ffd0: 72 65 65 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ree(pKeyInfo);. 
ffe0: 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
fff0: 5f 65 6e 64 3a 0a 20 20 72 65 74 75 72 6e 20 72  _end:.  return r
10000 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
10010 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10020 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
10030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10040 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 53 63  IT_VIEW./*.** Sc
10050 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
10060 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
10070 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
10080 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
10090 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
100a0 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
100b0 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
100c0 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
100d0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
100e0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
100f0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
10100 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
10110 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
10120 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10130 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
10140 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
10150 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
10160 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
10170 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
10180 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
10190 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
101a0 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
101b0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
101c0 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
101d0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
101e0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
101f0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
10200 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
10210 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
10220 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
10230 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
10240 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
10250 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
10260 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
10270 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
10280 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
10290 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
102a0 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
102b0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
102c0 69 73 74 28 45 78 70 72 4c 69 73 74 2a 2c 69 6e  ist(ExprList*,in
102d0 74 2c 45 78 70 72 4c 69 73 74 2a 29 3b 20 20 2f  t,ExprList*);  /
102e0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 20 2a  * Forward Decl *
102f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
10300 62 73 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  bstSelect(Select
10310 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
10320 74 20 2a 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72  t *);  /* Forwar
10330 64 20 44 65 63 6c 20 2a 2f 0a 73 74 61 74 69 63  d Decl */.static
10340 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
10350 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
10360 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73   iTable, ExprLis
10370 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66  t *pEList){.  if
10380 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
10390 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72  urn;.  if( pExpr
103a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
103b0 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
103c0 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ==iTable ){.    
103d0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
103e0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45  mn<0 ){.      pE
103f0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c  xpr->op = TK_NUL
10400 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
10410 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a      Expr *pNew;.
10420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10430 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
10440 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74  ->iColumn<pEList
10450 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
10460 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
10470 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
10480 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20  r->pRight==0 && 
10490 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20  pExpr->pList==0 
104a0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
104b0 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
104c0 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
104d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
104e0 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  New!=0 );.      
104f0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77  pExpr->op = pNew
10500 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  ->op;.      asse
10510 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
10520 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
10530 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr->pLeft = sqli
10540 74 65 33 45 78 70 72 44 75 70 28 70 4e 65 77 2d  te3ExprDup(pNew-
10550 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61  >pLeft);.      a
10560 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52  ssert( pExpr->pR
10570 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
10580 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
10590 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
105a0 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20  pNew->pRight);. 
105b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
105c0 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
105d0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
105e0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
105f0 4c 69 73 74 44 75 70 28 70 4e 65 77 2d 3e 70 4c  ListDup(pNew->pL
10600 69 73 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ist);.      pExp
10610 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77  r->iTable = pNew
10620 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
10630 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
10640 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pNew->iColumn;.
10650 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
10660 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a  g = pNew->iAgg;.
10670 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
10680 65 6e 43 6f 70 79 28 26 70 45 78 70 72 2d 3e 74  enCopy(&pExpr->t
10690 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b  oken, &pNew->tok
106a0 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
106b0 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 45 78  e3TokenCopy(&pEx
106c0 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d  pr->span, &pNew-
106d0 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45  >span);.      pE
106e0 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  xpr->pSelect = s
106f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
10700 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pNew->pSelect);.
10710 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61        pExpr->fla
10720 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73  gs = pNew->flags
10730 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
10740 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
10750 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
10760 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10770 20 20 73 75 62 73 74 45 78 70 72 28 70 45 78 70    substExpr(pExp
10780 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
10790 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
107a0 73 75 62 73 74 53 65 6c 65 63 74 28 70 45 78 70  substSelect(pExp
107b0 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  r->pSelect, iTab
107c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
107d0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
107e0 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61  Expr->pList, iTa
107f0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
10800 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
10810 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 45 78  substExprList(Ex
10820 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69  prList *pList, i
10830 6e 74 20 69 54 61 62 6c 65 2c 20 45 78 70 72 4c  nt iTable, ExprL
10840 69 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20  ist *pEList){.  
10850 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
10860 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
10870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
10880 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
10890 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
108a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
108b0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
108c0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
108d0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
108e0 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
108f0 69 54 61 62 6c 65 2c 20 45 78 70 72 4c 69 73 74  iTable, ExprList
10900 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69 66 28   *pEList){.  if(
10910 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
10920 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d  substExprList(p-
10930 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
10940 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
10950 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
10960 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
10970 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
10980 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
10990 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
109a0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
109b0 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  r(p->pHaving, iT
109c0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
109d0 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57   substExpr(p->pW
109e0 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
109f0 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  List);.}.#endif 
10a00 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10a10 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
10a20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10a30 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
10a40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
10a50 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
10a60 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
10a70 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
10a80 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
10a90 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
10aa0 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
10ab0 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
10ac0 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
10ad0 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
10ae0 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
10af0 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
10b00 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
10b10 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
10b20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10b30 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
10b40 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
10b50 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
10b60 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
10b70 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
10b80 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
10b90 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
10ba0 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
10bb0 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
10bc0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
10bd0 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
10be0 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
10bf0 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
10c00 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
10c10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
10c20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
10c30 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
10c40 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
10c50 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
10c60 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
10c70 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
10c80 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
10c90 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
10ca0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
10cb0 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
10cc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
10cd0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
10ce0 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
10cf0 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
10d00 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
10d10 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
10d20 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
10d30 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
10d40 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
10d50 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
10d60 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
10d70 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
10d80 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
10d90 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
10da0 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
10db0 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
10dc0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
10dd0 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
10de0 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
10df0 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
10e00 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
10e10 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
10e20 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
10e30 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
10e40 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
10e50 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
10e60 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
10e70 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
10e80 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
10e90 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
10ea0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
10eb0 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
10ec0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
10ed0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
10ee0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
10ef0 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
10f00 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
10f10 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
10f20 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
10f30 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
10f40 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
10f50 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 2c 20  eft outer join, 
10f60 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  or.**        the
10f70 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
10f80 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e 2e 20   itself a join. 
10f90 20 28 54 69 63 6b 65 74 20 23 33 30 36 29 0a 2a   (Ticket #306).*
10fa0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
10fb0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
10fc0 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20  DISTINCT or the 
10fd0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
10fe0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
10ff0 20 20 20 28 35 29 20 20 54 68 65 20 73 75 62 71     (5)  The subq
11000 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
11010 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
11020 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
11030 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
11040 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
11050 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
11060 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
11070 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
11080 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
11090 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
110a0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
110b0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
110c0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
110d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
110e0 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
110f0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
11100 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
11110 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
11120 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
11130 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
11140 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
11150 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
11160 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
11170 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
11180 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
11190 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
111a0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
111b0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
111c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
111d0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
111e0 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
111f0 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
11200 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
11210 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
11220 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
11230 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
11240 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65 20 73  .**  (12)  The s
11250 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
11260 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
11270 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
11280 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20  IN or the.**    
11290 20 20 20 20 73 75 62 71 75 65 72 79 20 68 61 73      subquery has
112a0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
112b0 2e 20 20 28 61 64 64 65 64 20 62 79 20 74 69 63  .  (added by tic
112c0 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a 2a 20  ket #350).**.** 
112d0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
112e0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
112f0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
11300 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20  use LIMIT.**.** 
11310 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
11320 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
11330 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 49 6e   OFFSET.**.** In
11340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
11350 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
11360 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
11370 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
11380 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
11390 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
113a0 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
113b0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
113c0 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
113d0 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
113e0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
113f0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
11400 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
11410 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
11420 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
11430 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
11440 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11450 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
11460 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
11470 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
11480 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11490 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
114a0 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
114b0 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
114c0 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
114d0 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
114e0 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
114f0 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
11500 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
11510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
11520 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
11530 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
11550 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
11560 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
11580 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53  arent or outer S
11590 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
115a0 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
115b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
115c0 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61  ex in p->pSrc->a
115d0 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  [] of the inner 
115e0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
115f0 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20  t isAgg,        
11600 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75     /* True if ou
11610 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20  ter SELECT uses 
11620 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
11630 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  ons */.  int sub
11640 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a  queryIsAgg    /*
11650 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62   True if the sub
11660 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
11670 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
11680 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
11690 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
116a0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
116b0 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
116c0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
116d0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
116e0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
116f0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
11700 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
11710 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
11720 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
11730 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
11740 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
11750 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
11760 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
11770 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
11780 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
11790 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
117a0 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
117b0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
117c0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
117d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
117e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
117f0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
11800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11810 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11820 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
11830 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
11840 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
11850 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
11860 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  /..  /* Check to
11870 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
11880 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
11890 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
118a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3d  t..  */.  if( p=
118b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
118c0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
118d0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
118e0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
118f0 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
11900 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
11910 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
11920 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
11930 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
11940 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
11950 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  ;.  if( isAgg &&
11960 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
11970 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
11980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11990 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a  striction (1)  *
119a0 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79  /.  if( subquery
119b0 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e  IsAgg && pSrc->n
119c0 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
119d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
119e0 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a  striction (2)  *
119f0 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53  /.  pSubSrc = pS
11a00 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65  ub->pSrc;.  asse
11a10 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20  rt( pSubSrc );. 
11a20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72   /* Prior to ver
11a30 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e  sion 3.1.2, when
11a40 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
11a50 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70  T had to be simp
11a60 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20  le constants,.  
11a70 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79  ** not arbitrary
11a80 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77   expresssions, w
11a90 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
11aa0 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
11ab0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
11ac0 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
11ad0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
11ae0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11af0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
11b00 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
11b10 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
11b20 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
11b30 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
11b40 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
11b50 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
11b60 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
11b70 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
11b80 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
11b90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
11ba0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11bb0 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
11bc0 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
11bd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11c00 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
11c10 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
11c20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
11c50 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
11c60 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
11c70 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t || pSub->pLimi
11c80 74 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  t) .         && 
11c90 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
11ca0 20 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20   isAgg) ){      
11cb0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
11cc0 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29  ons (4)(5)(8)(9)
11cd0 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20   */.     return 
11ce0 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20  0;       .  }.  
11cf0 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  if( p->isDistinc
11d00 74 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  t && subqueryIsA
11d10 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
11d20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
11d30 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
11d40 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77  if( (p->disallow
11d50 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f  OrderBy || p->pO
11d60 72 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d  rderBy) && pSub-
11d70 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
11d80 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
11dc0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
11dd0 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
11de0 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
11df0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
11e00 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
11e10 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
11e20 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
11e30 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
11e40 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
11e50 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
11e60 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
11e70 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
11e80 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
11e90 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
11ea0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
11eb0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
11ec0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
11ed0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
11ee0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
11ef0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
11f00 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
11f10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
11f20 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
11f30 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
11f40 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
11f50 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 69 46 72  c->nSrc>1 && iFr
11f60 6f 6d 3e 30 20 26 26 20 28 70 53 72 63 2d 3e 61  om>0 && (pSrc->a
11f70 5b 69 46 72 6f 6d 2d 31 5d 2e 6a 6f 69 6e 74 79  [iFrom-1].jointy
11f80 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
11f90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
11fa0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
11fb0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
11fc0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
11fd0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
11fe0 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
11ff0 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
12000 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
12010 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
12020 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
12030 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
12040 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
12050 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
12060 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
12070 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
12080 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
12090 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
120a0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
120b0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
120c0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
120d0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
120e0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
120f0 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
12100 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
12110 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
12120 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
12130 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
12140 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
12150 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
12160 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
12170 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
12180 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20  NER JOIN..  */. 
12190 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
121a0 28 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 2d 31  (pSrc->a[iFrom-1
121b0 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
121c0 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20  OUTER)!=0 .     
121d0 20 26 26 20 70 53 75 62 2d 3e 70 57 68 65 72 65   && pSub->pWhere
121e0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
121f0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
12200 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
12210 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
12220 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
12230 72 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a  rmitted for the.
12240 20 20 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e    ** iFrom-th en
12250 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
12260 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75  clause in the ou
12270 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
12280 0a 20 20 2f 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f  .  /* Move all o
12290 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
122a0 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
122b0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
122c0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
122d0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
122e0 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
122f0 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
12300 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
12310 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
12320 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
12330 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
12340 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
12350 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
12360 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
12370 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
12380 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
12390 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
123a0 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
123b0 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
123c0 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
123d0 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
123e0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
123f0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
12400 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
12410 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
12420 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
12430 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
12440 2e 0a 20 20 2a 2f 0a 20 20 69 50 61 72 65 6e 74  ..  */.  iParent
12450 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
12460 72 73 6f 72 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  rsor;.  {.    in
12470 74 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62  t nSubSrc = pSub
12480 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69  Src->nSrc;.    i
12490 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53  nt jointype = pS
124a0 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
124b0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ;..    sqlite3De
124c0 6c 65 74 65 54 61 62 6c 65 28 30 2c 20 70 53 75  leteTable(0, pSu
124d0 62 69 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  bitem->pTab);.  
124e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 75    sqliteFree(pSu
124f0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
12500 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
12510 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  e(pSubitem->zNam
12520 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  e);.    sqliteFr
12530 65 65 28 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  ee(pSubitem->zAl
12540 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ias);.    if( nS
12550 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
12560 20 69 6e 74 20 65 78 74 72 61 20 3d 20 6e 53 75   int extra = nSu
12570 62 53 72 63 20 2d 20 31 3b 0a 20 20 20 20 20 20  bSrc - 1;.      
12580 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 53 75 62 53  for(i=1; i<nSubS
12590 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
125a0 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33    pSrc = sqlite3
125b0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 53  SrcListAppend(pS
125c0 72 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rc, 0, 0);.     
125d0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63   }.      p->pSrc
125e0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
125f0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
12600 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
12610 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
12620 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
12630 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
12640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12650 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
12660 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
12670 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
12680 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
12690 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
126a0 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
126b0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
126c0 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
126d0 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
126e0 72 6f 6d 2b 6e 53 75 62 53 72 63 2d 31 5d 2e 6a  rom+nSubSrc-1].j
126f0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
12700 70 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  pe;.  }..  /* No
12710 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
12720 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
12730 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
12740 69 6f 6e 73 20 66 6f 72 20 0a 20 20 2a 2a 20 72  ions for .  ** r
12750 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
12760 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
12770 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
12780 2a 20 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  * .  ** Example:
12790 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 4c  .  **.  **   SEL
127a0 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
127b0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
127c0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
127d0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
127e0 62 3b 0a 20 20 2a 2a 20 20 20 5c 20 20 20 20 20  b;.  **   \     
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73  \_____________ s
12810 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  ubquery ________
12820 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20  __/          /. 
12830 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
12840 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
12850 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
12860 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
12870 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 2a 2a 0a 20  ________/.  **. 
12880 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
12890 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
128a0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
128b0 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
128c0 63 65 20 77 65 20 73 65 65 0a 20 20 2a 2a 20 22  ce we see.  ** "
128d0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
128e0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
128f0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
12900 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
12910 22 79 2b 31 30 22 2e 0a 20 20 2a 2f 0a 20 20 73  "y+10"..  */.  s
12920 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 2d 3e  ubstExprList(p->
12930 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
12940 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
12950 20 20 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c    pList = p->pEL
12960 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
12970 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
12980 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
12990 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
129a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
129b0 3d 3d 30 20 26 26 20 28 70 45 78 70 72 20 3d 20  ==0 && (pExpr = 
129c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
129d0 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b  r)->span.z!=0 ){
129e0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  .      pList->a[
129f0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
12a00 65 53 74 72 4e 44 75 70 28 28 63 68 61 72 2a 29  eStrNDup((char*)
12a10 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
12a20 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
12a30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
12a40 73 41 67 67 20 29 7b 0a 20 20 20 20 73 75 62 73  sAgg ){.    subs
12a50 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  tExprList(p->pGr
12a60 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
12a70 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
12a80 20 20 20 73 75 62 73 74 45 78 70 72 28 70 2d 3e     substExpr(p->
12a90 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
12aa0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
12ab0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62 2d  .  }.  if( pSub-
12ac0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12ad0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
12ae0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 70  erBy==0 );.    p
12af0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
12b00 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
12b10 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
12b20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
12b30 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
12b40 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
12b50 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  t(p->pOrderBy, i
12b60 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
12b70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
12b80 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
12b90 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71  .    pWhere = sq
12ba0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53 75  lite3ExprDup(pSu
12bb0 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 7d 65  b->pWhere);.  }e
12bc0 6c 73 65 7b 0a 20 20 20 20 70 57 68 65 72 65 20  lse{.    pWhere 
12bd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
12be0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
12bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12c00 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
12c10 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 2d   p->pHaving = p-
12c20 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 70 2d 3e  >pWhere;.    p->
12c30 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
12c40 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 70  .    substExpr(p
12c50 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
12c60 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
12c70 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
12c80 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
12c90 6e 64 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 73  nd(p->pHaving, s
12ca0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 53  qlite3ExprDup(pS
12cb0 75 62 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20  ub->pHaving));. 
12cc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
12cd0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
12ce0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
12cf0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
12d00 70 28 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  p(pSub->pGroupBy
12d10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12d20 73 75 62 73 74 45 78 70 72 28 70 2d 3e 70 57 68  substExpr(p->pWh
12d30 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
12d40 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
12d50 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c   p->pWhere = sql
12d60 69 74 65 33 45 78 70 72 41 6e 64 28 70 2d 3e 70  ite3ExprAnd(p->p
12d70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
12d80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6c    }..  /* The fl
12d90 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
12da0 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
12db0 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
12dc0 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 65 72 20   the.  ** outer 
12dd0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
12de0 74 2e 20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 73  t. .  */.  p->is
12df0 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
12e00 44 69 73 74 69 6e 63 74 20 7c 7c 20 70 53 75 62  Distinct || pSub
12e10 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 0a 20  ->isDistinct;.. 
12e20 20 2f 2a 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20   /*.  ** SELECT 
12e30 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
12e40 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
12e50 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
12e60 46 46 53 45 54 20 79 3b 0a 20 20 2a 2a 0a 20 20  FFSET y;.  **.  
12e70 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
12e80 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
12e90 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
12ea0 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
12eb0 42 75 74 20 74 68 69 73 0a 20 20 2a 2a 20 64 6f  But this.  ** do
12ec0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
12ed0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
12ee0 65 67 61 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  egative..  */.  
12ef0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
12f00 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   ){.    p->pLimi
12f10 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
12f20 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d  ;.    pSub->pLim
12f30 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  it = 0;.  }..  /
12f40 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
12f50 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
12f60 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
12f70 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
12f80 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
12f90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
12fa0 65 74 65 28 70 53 75 62 29 3b 0a 20 20 72 65 74  ete(pSub);.  ret
12fb0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
12fc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
12fd0 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  IEW */../*.** An
12fe0 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
12ff0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
13000 64 20 69 6e 20 61 73 20 61 6e 20 61 72 67 75 6d  d in as an argum
13010 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74  ent to see if it
13020 0a 2a 2a 20 69 73 20 61 20 73 69 6d 70 6c 65 20  .** is a simple 
13030 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
13040 75 65 72 79 2e 20 20 49 66 20 69 74 20 69 73 20  uery.  If it is 
13050 61 6e 64 20 74 68 69 73 20 71 75 65 72 79 20 63  and this query c
13060 61 6e 20 62 65 0a 2a 2a 20 73 61 74 69 73 66 69  an be.** satisfi
13070 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ed using a singl
13080 65 20 73 65 65 6b 20 74 6f 20 74 68 65 20 62 65  e seek to the be
13090 67 69 6e 6e 69 6e 67 20 6f 72 20 65 6e 64 20 6f  ginning or end o
130a0 66 20 61 6e 20 69 6e 64 65 78 2c 0a 2a 2a 20 74  f an index,.** t
130b0 68 65 6e 20 67 65 6e 65 72 61 74 65 20 74 68 65  hen generate the
130c0 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 53   code for this S
130d0 45 4c 45 43 54 20 61 6e 64 20 72 65 74 75 72 6e  ELECT and return
130e0 20 31 2e 20 20 49 66 20 74 68 69 73 20 69 73 20   1.  If this is 
130f0 6e 6f 74 20 61 20 0a 2a 2a 20 73 69 6d 70 6c 65  not a .** simple
13100 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
13110 71 75 65 72 79 2c 20 74 68 65 6e 20 72 65 74 75  query, then retu
13120 72 6e 20 30 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 69  rn 0;.**.** A si
13130 6d 70 6c 79 20 6d 69 6e 28 29 20 6f 72 20 6d 61  mply min() or ma
13140 78 28 29 20 71 75 65 72 79 20 6c 6f 6f 6b 73 20  x() query looks 
13150 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
13160 20 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 61      SELECT min(a
13170 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
13180 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 61      SELECT max(a
13190 29 20 46 52 4f 4d 20 74 61 62 6c 65 3b 0a 2a 2a  ) FROM table;.**
131a0 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 6d 61  .** The query ma
131b0 79 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69  y have only a si
131c0 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 69 74  ngle table in it
131d0 73 20 46 52 4f 4d 20 61 72 67 75 6d 65 6e 74 2e  s FROM argument.
131e0 20 20 54 68 65 72 65 0a 2a 2a 20 63 61 6e 20 62    There.** can b
131f0 65 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 6f 72  e no GROUP BY or
13200 20 48 41 56 49 4e 47 20 6f 72 20 57 48 45 52 45   HAVING or WHERE
13210 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 72   clauses.  The r
13220 65 73 75 6c 74 20 73 65 74 20 6d 75 73 74 0a 2a  esult set must.*
13230 2a 20 62 65 20 74 68 65 20 6d 69 6e 28 29 20 6f  * be the min() o
13240 72 20 6d 61 78 28 29 20 6f 66 20 61 20 73 69 6e  r max() of a sin
13250 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  gle column of th
13260 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f  e table.  The co
13270 6c 75 6d 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6d  lumn.** in the m
13280 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
13290 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 69  nction must be i
132a0 6e 64 65 78 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndexed..**.** Th
132b0 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
132c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 72 65  this routine are
132d0 20 74 68 65 20 73 61 6d 65 20 61 73 20 66 6f 72   the same as for
132e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
132f0 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
13300 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  der comment on t
13310 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  hat routine for 
13320 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
13330 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
13340 63 20 69 6e 74 20 73 69 6d 70 6c 65 4d 69 6e 4d  c int simpleMinM
13350 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70  axQuery(Parse *p
13360 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
13370 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
13380 20 69 50 61 72 6d 29 7b 0a 20 20 45 78 70 72 20   iParm){.  Expr 
13390 2a 70 45 78 70 72 3b 0a 20 20 69 6e 74 20 69 43  *pExpr;.  int iC
133a0 6f 6c 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ol;.  Table *pTa
133b0 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
133c0 3b 0a 20 20 69 6e 74 20 62 61 73 65 3b 0a 20 20  ;.  int base;.  
133d0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 73  Vdbe *v;.  int s
133e0 65 65 6b 4f 70 3b 0a 20 20 45 78 70 72 4c 69 73  eekOp;.  ExprLis
133f0 74 20 2a 70 45 4c 69 73 74 2c 20 2a 70 4c 69 73  t *pEList, *pLis
13400 74 2c 20 65 4c 69 73 74 3b 0a 20 20 73 74 72 75  t, eList;.  stru
13410 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13420 20 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 53 72   eListItem;.  Sr
13430 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 69  cList *pSrc;.  i
13440 6e 74 20 62 72 6b 3b 0a 20 20 69 6e 74 20 69 44  nt brk;.  int iD
13450 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
13460 6f 20 73 65 65 20 69 66 20 74 68 69 73 20 71 75  o see if this qu
13470 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
13480 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71  min() or max() q
13490 75 65 72 79 2e 20 20 52 65 74 75 72 6e 0a 20 20  uery.  Return.  
134a0 2a 2a 20 7a 65 72 6f 20 69 66 20 69 74 20 69 73  ** zero if it is
134b0 20 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66    not..  */.  if
134c0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 7c 7c  ( p->pGroupBy ||
134d0 20 70 2d 3e 70 48 61 76 69 6e 67 20 7c 7c 20 70   p->pHaving || p
134e0 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
134f0 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
13500 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72  >pSrc;.  if( pSr
13510 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  c->nSrc!=1 ) ret
13520 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69 73 74 20  urn 0;.  pEList 
13530 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
13540 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  f( pEList->nExpr
13550 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
13560 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74    pExpr = pEList
13570 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
13580 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
13590 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
135a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4c 69   return 0;.  pLi
135b0 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
135c0 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  t;.  if( pList==
135d0 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  0 || pList->nExp
135e0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
135f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f  .  if( pExpr->to
13600 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72  ken.n!=3 ) retur
13610 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
13620 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
13630 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
13640 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
13650 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
13660 52 65 77 69 6e 64 3b 0a 20 20 7d 65 6c 73 65 20  Rewind;.  }else 
13670 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
13680 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72  Cmp((char*)pExpr
13690 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c  ->token.z,"max",
136a0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 65  3)==0 ){.    see
136b0 6b 4f 70 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20  kOp = OP_Last;. 
136c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
136d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 45 78 70  rn 0;.  }.  pExp
136e0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  r = pList->a[0].
136f0 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
13700 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
13710 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
13720 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
13730 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20  olumn;.  pTab = 
13740 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
13750 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ...  /* If we ge
13760 74 20 74 6f 20 68 65 72 65 2c 20 69 74 20 6d 65  t to here, it me
13770 61 6e 73 20 74 68 65 20 71 75 65 72 79 20 69 73  ans the query is
13780 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
13790 66 6f 72 6d 2e 0a 20 20 2a 2a 20 43 68 65 63 6b  form..  ** Check
137a0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   to make sure we
137b0 20 68 61 76 65 20 61 6e 20 69 6e 64 65 78 20 61   have an index a
137c0 6e 64 20 6d 61 6b 65 20 70 49 64 78 20 70 6f 69  nd make pIdx poi
137d0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 61  nt to the.  ** a
137e0 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78  ppropriate index
137f0 2e 20 20 49 66 20 74 68 65 20 6d 69 6e 28 29 20  .  If the min() 
13800 6f 72 20 6d 61 78 28 29 20 69 73 20 6f 6e 20 61  or max() is on a
13810 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
13820 59 0a 20 20 2a 2a 20 6b 65 79 20 63 6f 6c 75 6d  Y.  ** key colum
13830 6e 2c 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 6e  n, no index is n
13840 65 63 65 73 73 61 72 79 20 73 6f 20 73 65 74 20  ecessary so set 
13850 70 49 64 78 20 74 6f 20 4e 55 4c 4c 2e 20 20 49  pIdx to NULL.  I
13860 66 20 6e 6f 0a 20 20 2a 2a 20 75 73 61 62 6c 65  f no.  ** usable
13870 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2c   index is found,
13880 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a   return 0..  */.
13890 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
138a0 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20      pIdx = 0;.  
138b0 7d 65 6c 73 65 7b 0a 20 20 20 20 43 6f 6c 6c 53  }else{.    CollS
138c0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
138d0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
138e0 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
138f0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
13900 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
13910 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
13920 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13930 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
13940 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
13950 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
13960 3d 3d 69 43 6f 6c 20 26 26 20 0a 20 20 20 20 20  ==iCol && .     
13970 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
13980 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 61 7a 43  trICmp(pIdx->azC
13990 6f 6c 6c 5b 30 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  oll[0], pColl->z
139a0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
139b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
139c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
139d0 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  dx==0 ) return 0
139e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 64 65 6e  ;.  }..  /* Iden
139f0 74 69 66 79 20 63 6f 6c 75 6d 6e 20 74 79 70 65  tify column type
13a00 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65 20  s if we will be 
13a10 75 73 69 6e 67 20 74 68 65 20 63 61 6c 6c 62 61  using the callba
13a20 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
13a30 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
13a40 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
13a50 67 6f 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65  going to a table
13a60 20 6f 72 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   or a memory cel
13a70 6c 2e 0a 20 20 2a 2a 20 54 68 65 20 63 6f 6c 75  l..  ** The colu
13a80 6d 6e 20 6e 61 6d 65 73 20 68 61 76 65 20 61 6c  mn names have al
13a90 72 65 61 64 79 20 62 65 65 6e 20 67 65 6e 65 72  ready been gener
13aa0 61 74 65 64 20 69 6e 20 74 68 65 20 63 61 6c 6c  ated in the call
13ab0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  ing function..  
13ac0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
13ad0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13ae0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
13af0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  turn 0;..  /* If
13b00 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
13b10 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
13b20 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
13b30 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
13b40 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
13b50 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  ==SRT_VirtualTab
13b60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13b70 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
13b80 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72  penVirtual, iPar
13b90 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  m, 1);.  }..  /*
13ba0 20 47 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   Generating code
13bb0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 69 6e   to find the min
13bc0 20 6f 72 20 74 68 65 20 6d 61 78 2e 20 20 42 61   or the max.  Ba
13bd0 73 69 63 61 6c 6c 79 20 61 6c 6c 20 77 65 20 68  sically all we h
13be0 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69  ave.  ** to do i
13bf0 73 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  s find the first
13c00 20 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6e 74   or the last ent
13c10 72 79 20 69 6e 20 74 68 65 20 63 68 6f 73 65 6e  ry in the chosen
13c20 20 69 6e 64 65 78 2e 20 20 49 66 0a 20 20 2a 2a   index.  If.  **
13c30 20 74 68 65 20 6d 69 6e 28 29 20 6f 72 20 6d 61   the min() or ma
13c40 78 28 29 20 69 73 20 6f 6e 20 74 68 65 20 49 4e  x() is on the IN
13c50 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
13c60 59 2c 20 74 68 65 6e 20 66 69 6e 64 20 74 68 65  Y, then find the
13c70 20 66 69 72 73 74 0a 20 20 2a 2a 20 6f 72 20 6c   first.  ** or l
13c80 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
13c90 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 20 20 2a   main table..  *
13ca0 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
13cb0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
13cc0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
13cd0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
13ce0 65 72 74 28 20 69 44 62 3e 3d 30 20 7c 7c 20 70  ert( iDb>=0 || p
13cf0 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74  Tab->isTransient
13d00 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64   );.  sqlite3Cod
13d10 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
13d20 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
13d30 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
13d40 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
13d50 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
13d60 3e 7a 4e 61 6d 65 29 3b 0a 20 20 62 61 73 65 20  >zName);.  base 
13d70 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  = pSrc->a[0].iCu
13d80 72 73 6f 72 3b 0a 20 20 62 72 6b 20 3d 20 73 71  rsor;.  brk = sq
13d90 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13da0 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
13db0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
13dc0 50 61 72 73 65 2c 20 70 2c 20 62 72 6b 29 3b 0a  Parse, p, brk);.
13dd0 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
13de0 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  .pSelect==0 ){. 
13df0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
13e00 62 6c 65 28 70 50 61 72 73 65 2c 20 62 61 73 65  ble(pParse, base
13e10 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
13e20 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 7d 0a 20  OpenRead);.  }. 
13e30 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a   if( pIdx==0 ){.
13e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13e50 64 64 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20  ddOp(v, seekOp, 
13e60 62 61 73 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  base, 0);.  }els
13e70 65 7b 0a 20 20 20 20 2f 2a 20 45 76 65 6e 20 74  e{.    /* Even t
13e80 68 6f 75 67 68 20 74 68 65 20 63 75 72 73 6f 72  hough the cursor
13e90 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
13ea0 65 20 69 6e 64 65 78 20 68 65 72 65 20 69 73 20  e index here is 
13eb0 63 6c 6f 73 65 64 0a 20 20 20 20 2a 2a 20 61 73  closed.    ** as
13ec0 20 73 6f 6f 6e 20 61 73 20 61 20 73 69 6e 67 6c   soon as a singl
13ed0 65 20 76 61 6c 75 65 20 68 61 73 20 62 65 65 6e  e value has been
13ee0 20 72 65 61 64 20 66 72 6f 6d 20 69 74 2c 20 61   read from it, a
13ef0 6c 6c 6f 63 61 74 65 20 69 74 0a 20 20 20 20 2a  llocate it.    *
13f00 2a 20 75 73 69 6e 67 20 28 70 50 61 72 73 65 2d  * using (pParse-
13f10 3e 6e 54 61 62 2b 2b 29 20 74 6f 20 70 72 65 76  >nTab++) to prev
13f20 65 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  ent the cursor i
13f30 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 0a 20 20  d from being .  
13f40 20 20 2a 2a 20 72 65 75 73 65 64 2e 20 54 68 69    ** reused. Thi
13f50 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  s is important f
13f60 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66  or statements of
13f70 20 74 68 65 20 66 6f 72 6d 20 0a 20 20 20 20 2a   the form .    *
13f80 2a 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  * "INSERT INTO x
13f90 20 53 45 4c 45 43 54 20 6d 61 78 28 29 20 46 52   SELECT max() FR
13fa0 4f 4d 20 78 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  OM x"..    */.  
13fb0 20 20 69 6e 74 20 69 49 64 78 3b 0a 20 20 20 20    int iIdx;.    
13fc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
13fd0 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
13fe0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
13ff0 29 3b 0a 20 20 20 20 69 49 64 78 20 3d 20 70 50  );.    iIdx = pP
14000 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14010 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
14020 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
14030 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
14040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14050 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44  , OP_Integer, iD
14060 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
14070 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
14080 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 2c 20  OpenRead, iIdx, 
14090 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 0a 20 20 20  pIdx->tnum, .   
140a0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
140b0 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
140c0 44 4f 46 46 29 3b 0a 20 20 20 20 69 66 28 20 73  DOFF);.    if( s
140d0 65 65 6b 4f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  eekOp==OP_Rewind
140e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
140f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14100 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  _Null, 0, 0);.  
14110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14120 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
14130 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a 20 20  ecord, 1, 0);.  
14140 20 20 20 20 73 65 65 6b 4f 70 20 3d 20 4f 50 5f      seekOp = OP_
14150 4d 6f 76 65 47 74 3b 0a 20 20 20 20 7d 0a 20 20  MoveGt;.    }.  
14160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14170 4f 70 28 76 2c 20 73 65 65 6b 4f 70 2c 20 69 49  Op(v, seekOp, iI
14180 64 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  dx, 0);.    sqli
14190 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
141a0 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
141b0 78 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  x, 0);.    sqlit
141c0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
141d0 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 2c 20 30  P_Close, iIdx, 0
141e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
141f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
14200 76 65 47 65 2c 20 62 61 73 65 2c 20 30 29 3b 0a  veGe, base, 0);.
14210 20 20 7d 0a 20 20 65 4c 69 73 74 2e 6e 45 78 70    }.  eList.nExp
14220 72 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 1;.  memset(
14230 26 65 4c 69 73 74 49 74 65 6d 2c 20 30 2c 20 73  &eListItem, 0, s
14240 69 7a 65 6f 66 28 65 4c 69 73 74 49 74 65 6d 29  izeof(eListItem)
14250 29 3b 0a 20 20 65 4c 69 73 74 2e 61 20 3d 20 26  );.  eList.a = &
14260 65 4c 69 73 74 49 74 65 6d 3b 0a 20 20 65 4c 69  eListItem;.  eLi
14270 73 74 2e 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20  st.a[0].pExpr = 
14280 70 45 78 70 72 3b 0a 20 20 73 65 6c 65 63 74 49  pExpr;.  selectI
14290 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
142a0 20 70 2c 20 26 65 4c 69 73 74 2c 20 30 2c 20 30   p, &eList, 0, 0
142b0 2c 20 30 2c 20 2d 31 2c 20 65 44 65 73 74 2c 20  , 0, -1, eDest, 
142c0 69 50 61 72 6d 2c 20 62 72 6b 2c 20 62 72 6b 2c  iParm, brk, brk,
142d0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
142e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
142f0 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65  , brk);.  sqlite
14300 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14310 5f 43 6c 6f 73 65 2c 20 62 61 73 65 2c 20 30 29  _Close, base, 0)
14320 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 31 3b  ;.  .  return 1;
14330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
14340 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 6f  e and ORDER BY o
14350 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
14360 65 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  e in a SELECT st
14370 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
14380 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
14390 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a  f errors seen..*
143a0 2a 0a 2a 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  *.** An ORDER BY
143b0 20 6f 72 20 47 52 4f 55 50 20 42 59 20 69 73 20   or GROUP BY is 
143c0 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
143d0 73 69 6f 6e 73 2e 20 20 49 66 20 61 6e 79 20 65  sions.  If any e
143e0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
143f0 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
14400 61 6e 74 2c 20 74 68 65 6e 20 74 68 61 74 20 65  ant, then that e
14410 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 70  xpression is rep
14420 6c 61 63 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  laced by the.** 
14430 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 6e  corresponding en
14440 74 72 79 20 69 6e 20 74 68 65 20 72 65 73 75 6c  try in the resul
14450 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
14460 20 69 6e 74 20 70 72 6f 63 65 73 73 4f 72 64 65   int processOrde
14470 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65  rGroupBy(.  Name
14480 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
14490 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
144a0 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
144b0 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20  statement. */.  
144c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
144d0 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
144e0 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
144f0 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
14500 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
14510 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
14520 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f      /* Either "O
14530 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
14540 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
14550 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
14560 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14570 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
14580 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ;     /* The res
14590 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
145a0 45 4c 45 43 54 20 2a 2f 0a 20 20 50 61 72 73 65  ELECT */.  Parse
145b0 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
145c0 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 54  pParse;     /* T
145d0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
145e0 20 74 68 65 20 53 45 4c 45 43 54 20 2a 2f 0a 20   the SELECT */. 
145f0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 20   assert( pEList 
14600 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
14610 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
14620 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
14630 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
14640 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  i++){.    int iC
14650 6f 6c 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  ol;.    Expr *pE
14660 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
14670 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
14680 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
14690 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
146a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 43   ){.      if( iC
146b0 6f 6c 3e 30 20 26 26 20 69 43 6f 6c 3c 3d 70 45  ol>0 && iCol<=pE
146c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
146d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
146e0 70 72 44 65 6c 65 74 65 28 70 45 29 3b 0a 20 20  prDelete(pE);.  
146f0 20 20 20 20 20 20 70 45 20 3d 20 70 4f 72 64 65        pE = pOrde
14700 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
14710 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
14720 28 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 2d  (pEList->a[iCol-
14730 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
14740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14750 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14760 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
14770 20 20 20 20 22 25 73 20 42 59 20 63 6f 6c 75 6d      "%s BY colum
14780 6e 20 6e 75 6d 62 65 72 20 25 64 20 6f 75 74 20  n number %d out 
14790 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
147a0 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 20  d be ".         
147b0 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
147c0 20 25 64 22 2c 20 7a 54 79 70 65 2c 20 69 43 6f   %d", zType, iCo
147d0 6c 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l, pEList->nExpr
147e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
147f0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
14800 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
14810 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
14820 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
14830 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
14840 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
14850 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
14860 6e 74 28 70 45 29 20 29 7b 0a 20 20 20 20 20 20  nt(pE) ){.      
14870 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14880 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
14890 20 20 22 25 73 20 42 59 20 74 65 72 6d 73 20 6d    "%s BY terms m
148a0 75 73 74 20 6e 6f 74 20 62 65 20 6e 6f 6e 2d 69  ust not be non-i
148b0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 73  nteger constants
148c0 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  ", zType);.     
148d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
148e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
148f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14900 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20  outine resolves 
14910 61 6e 79 20 6e 61 6d 65 73 20 75 73 65 64 20 69  any names used i
14920 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
14930 20 6f 66 20 74 68 65 0a 2a 2a 20 73 75 70 70 6c   of the.** suppl
14940 69 65 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  ied SELECT state
14950 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 53 45 4c  ment. If the SEL
14960 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
14970 69 6e 67 20 72 65 73 6f 6c 76 65 64 0a 2a 2a 20  ing resolved.** 
14980 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2c  is a sub-select,
14990 20 74 68 65 6e 20 70 4f 75 74 65 72 4e 43 20 69   then pOuterNC i
149a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
149b0 68 65 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 0a  he NameContext .
149c0 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
149d0 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 69 6e 74 20   SELECT..*/.int 
149e0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73  sqlite3SelectRes
149f0 6f 6c 76 65 28 0a 20 20 50 61 72 73 65 20 2a 70  olve(.  Parse *p
14a00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
14a10 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
14a20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
14a30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14a40 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
14a50 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
14a60 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
14a70 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
14a80 20 20 2f 2a 20 54 68 65 20 6f 75 74 65 72 20 6e    /* The outer n
14a90 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 4d 61 79  ame context. May
14aa0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a   be NULL. */.){.
14ab0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14ac0 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
14ad0 52 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20  Result set. */. 
14ae0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
14af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14b00 6f 72 2d 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65  or-loop variable
14b10 20 75 73 65 64 20 69 6e 20 6d 75 6c 74 69 70 6c   used in multipl
14b20 65 20 70 6c 61 63 65 73 20 2a 2f 0a 20 20 4e 61  e places */.  Na
14b30 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
14b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
14b50 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 2a  l name-context *
14b60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
14b70 72 6f 75 70 42 79 3b 20 20 20 20 20 20 20 20 2f  roupBy;        /
14b80 2a 20 54 68 65 20 67 72 6f 75 70 20 62 79 20 63  * The group by c
14b90 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  lause */..  /* I
14ba0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 68  f this routine h
14bb0 61 73 20 72 75 6e 20 62 65 66 6f 72 65 2c 20 72  as run before, r
14bc0 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
14bd0 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  y. */.  if( p->i
14be0 73 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20  sResolved ){.   
14bf0 20 61 73 73 65 72 74 28 20 21 70 4f 75 74 65 72   assert( !pOuter
14c00 4e 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  NC );.    return
14c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14c20 20 20 70 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20    p->isResolved 
14c30 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 1;..  /* If th
14c40 65 72 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ere have already
14c50 20 62 65 65 6e 20 65 72 72 6f 72 73 2c 20 64 6f   been errors, do
14c60 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69   nothing. */.  i
14c70 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
14c80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14c90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14ca0 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20  }..  /* Prepare 
14cb0 74 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  the select state
14cc0 6d 65 6e 74 2e 20 54 68 69 73 20 63 61 6c 6c 20  ment. This call 
14cd0 77 69 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 61 6c  will allocate al
14ce0 6c 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 72  l cursors.  ** r
14cf0 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c  equired to handl
14d00 65 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64  e the tables and
14d10 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74   subqueries in t
14d20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
14d30 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 70 53    */.  if( prepS
14d40 65 6c 65 63 74 53 74 6d 74 28 70 50 61 72 73 65  electStmt(pParse
14d50 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
14d60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
14d70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  .  }..  /* Resol
14d80 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ve the expressio
14d90 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20  ns in the LIMIT 
14da0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
14db0 65 73 2e 20 54 68 65 73 65 0a 20 20 2a 2a 20 61  es. These.  ** a
14dc0 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  re not allowed t
14dd0 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  o refer to any n
14de0 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e  ames, so pass an
14df0 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65   empty NameConte
14e00 78 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  xt..  */.  memse
14e10 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
14e20 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
14e30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
14e40 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
14e50 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
14e60 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c  NC, p->pLimit) |
14e70 7c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  |.      sqlite3E
14e80 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28  xprResolveNames(
14e90 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74  &sNC, p->pOffset
14ea0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14eb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14ec0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74  }..  /* Set up t
14ed0 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  he local name-co
14ee0 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f  ntext to pass to
14ef0 20 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65   ExprResolveName
14f00 73 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 73 6f  s() to.  ** reso
14f10 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
14f20 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  on-list..  */.  
14f30 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  sNC.allowAgg = 1
14f40 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
14f50 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 73 4e   = p->pSrc;.  sN
14f60 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72  C.pNext = pOuter
14f70 4e 43 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  NC;..  /* Resolv
14f80 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72  e names in the r
14f90 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
14fa0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
14fb0 73 74 3b 0a 20 20 69 66 28 20 21 70 45 4c 69 73  st;.  if( !pELis
14fc0 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
14fd0 45 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 69  E_ERROR;.  for(i
14fe0 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
14ff0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
15000 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74  xpr *pX = pEList
15010 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
15020 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
15030 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73  rResolveNames(&s
15040 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20  NC, pX) ){.     
15050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15060 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
15070 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
15080 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  re no aggregate 
15090 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  functions in the
150a0 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64   result-set, and
150b0 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20   no GROUP BY .  
150c0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64  ** expression, d
150d0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72  o not allow aggr
150e0 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66  egates in any of
150f0 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
15100 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ssions..  */.  a
15110 73 73 65 72 74 28 20 21 70 2d 3e 69 73 41 67 67  ssert( !p->isAgg
15120 20 29 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d   );.  pGroupBy =
15130 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
15140 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20  if( pGroupBy || 
15150 73 4e 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20  sNC.hasAgg ){.  
15160 20 20 70 2d 3e 69 73 41 67 67 20 3d 20 31 3b 0a    p->isAgg = 1;.
15170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 4e 43    }else{.    sNC
15180 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20  .allowAgg = 0;. 
15190 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 48 41   }..  /* If a HA
151a0 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
151b0 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
151c0 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f  re must be a GRO
151d0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
151e0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76  */.  if( p->pHav
151f0 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
15200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
15210 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15220 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
15230 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
15240 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
15250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15260 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
15270 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70 72 65  /* Add the expre
15280 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74 68  ssion list to th
15290 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62  e name-context b
152a0 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68  efore parsing th
152b0 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70  e.  ** other exp
152c0 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
152d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
152e0 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  . This is so tha
152f0 74 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  t.  ** expressio
15300 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
15310 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61  clause (etc.) ca
15320 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65  n refer to expre
15330 73 73 69 6f 6e 73 20 62 79 0a 20 20 2a 2a 20 61  ssions by.  ** a
15340 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
15350 73 75 6c 74 20 73 65 74 2e 0a 20 20 2a 2a 0a 20  sult set..  **. 
15360 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a   ** Minor point:
15370 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15380 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65  case, then the e
15390 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  xpression will b
153a0 65 0a 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61  e.  ** re-evalua
153b0 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66  ted for each ref
153c0 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20  erence to it..  
153d0 2a 2f 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  */.  sNC.pEList 
153e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
153f0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
15400 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
15410 20 70 2d 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20   p->pWhere) ||. 
15420 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15430 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e  ResolveNames(&sN
15440 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 7c  C, p->pHaving) |
15450 7c 0a 20 20 20 20 20 20 70 72 6f 63 65 73 73 4f  |.      processO
15460 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
15470 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
15480 4f 52 44 45 52 22 29 20 7c 7c 0a 20 20 20 20 20  ORDER") ||.     
15490 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
154a0 75 70 42 79 28 26 73 4e 43 2c 20 70 47 72 6f 75  upBy(&sNC, pGrou
154b0 70 42 79 2c 20 22 47 52 4f 55 50 22 29 0a 20 20  pBy, "GROUP").  
154c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
154d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
154e0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
154f0 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
15500 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
15510 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
15520 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
15530 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
15540 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
15550 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
15560 3b 0a 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30  ;.  .    for(i=0
15570 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
15580 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
15590 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
155a0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
155b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
155c0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45  (pItem->pExpr, E
155d0 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
155e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
155f0 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65  g(pParse, "aggre
15600 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
15610 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
15620 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
15630 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
15640 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
15650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15660 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
15670 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
15680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15690 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
156a0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
156b0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
156c0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
156d0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
156e0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
156f0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
15700 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
15710 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
15720 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
15730 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
15740 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20  e simply stores 
15750 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
15760 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c  those memory cel
15770 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
15780 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
15790 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
157a0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
157b0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
157c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
157d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
157e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
157f0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70   *pFunc;.  if( p
15800 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70  AggInfo->nFunc+p
15810 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
15820 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
15830 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
15840 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
15850 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
15860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15870 70 28 76 2c 20 4f 50 5f 4d 65 6d 4e 75 6c 6c 2c  p(v, OP_MemNull,
15880 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
15890 69 5d 2e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 7d  i].iMem, 0);.  }
158a0 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
158b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
158c0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
158d0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
158e0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
158f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15900 4d 65 6d 4e 75 6c 6c 2c 20 70 46 75 6e 63 2d 3e  MemNull, pFunc->
15910 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 69 66  iMem, 0);.    if
15920 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
15930 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
15940 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
15950 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >pExpr;.      if
15960 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c  ( pE->pList==0 |
15970 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  | pE->pList->nEx
15980 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
15990 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
159a0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
159b0 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65 20  CT in aggregate 
159c0 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
159d0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62   ".           "b
159e0 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22  y an expression"
159f0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
15a00 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
15a10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15a20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
15a30 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
15a40 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
15a50 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74  Parse, pE->pList
15a60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15a70 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
15a80 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 70 46 75  OpenVirtual, pFu
15a90 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
15aa0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15ac0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 33  ar*)pKeyInfo, P3
15ad0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
15ae0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15af0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
15b00 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
15b10 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
15b20 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
15b30 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
15b40 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
15b50 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
15b60 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
15b70 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
15b80 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
15b90 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
15ba0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15bb0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
15bc0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
15bd0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
15be0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
15bf0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
15c00 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
15c10 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
15c20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
15c30 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
15c40 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
15c50 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 41 67  VdbeOp3(v, OP_Ag
15c60 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
15c70 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
15c80 3e 6e 45 78 70 72 20 3a 20 30 2c 0a 20 20 20 20  >nExpr : 0,.    
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
15cb0 6e 63 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b  nc, P3_FUNCDEF);
15cc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
15cd0 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
15ce0 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
15cf0 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
15d00 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
15d10 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
15d20 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
15d30 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
15d40 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
15d50 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
15d60 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
15d70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15d80 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
15d90 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
15da0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
15db0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
15dc0 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67  col *pC;..  pAgg
15dd0 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
15de0 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   = 1;.  for(i=0,
15df0 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
15e00 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
15e10 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
15e20 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  +){.    int nArg
15e30 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65  ;.    int addrNe
15e40 78 74 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 72  xt = 0;.    Expr
15e50 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
15e60 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
15e70 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
15e80 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
15e90 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
15ea0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
15eb0 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
15ec0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65  , pList);.    }e
15ed0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
15ee0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
15ef0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
15f00 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
15f10 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
15f20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
15f40 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
15f50 63 6f 64 65 44 69 73 74 69 6e 63 74 28 76 2c 20  codeDistinct(v, 
15f60 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
15f70 64 64 72 4e 65 78 74 2c 20 31 2c 20 32 29 3b 0a  ddrNext, 1, 2);.
15f80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
15f90 2d 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c  ->pFunc->needCol
15fa0 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f  lSeq ){.      Co
15fb0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
15fc0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
15fd0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
15fe0 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
15ff0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
16000 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
16010 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 70 4c 69   !pColl && j<pLi
16020 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20  st->nExpr; j++, 
16030 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
16040 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
16050 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
16060 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
16070 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
16080 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
16090 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
160a0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
160b0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
160c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
160d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op3(v, OP_CollSe
160e0 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  q, 0, 0, (char *
160f0 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53  )pColl, P3_COLLS
16100 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
16110 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
16120 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 70 46 2d   OP_AggStep, pF-
16130 3e 69 4d 65 6d 2c 20 6e 41 72 67 2c 20 28 76 6f  >iMem, nArg, (vo
16140 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50  id*)pF->pFunc, P
16150 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
16160 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
16170 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16180 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
16190 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
161a0 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c  }.  }.  for(i=0,
161b0 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
161c0 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
161d0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
161e0 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
161f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
16200 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 29  arse, pC->pExpr)
16210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16220 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
16230 53 74 6f 72 65 2c 20 70 43 2d 3e 69 4d 65 6d 2c  Store, pC->iMem,
16240 20 31 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49   1);.  }.  pAggI
16250 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
16260 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  = 0;.}.../*.** G
16270 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
16280 20 74 68 65 20 67 69 76 65 6e 20 53 45 4c 45 43   the given SELEC
16290 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
162a0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
162b0 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69  re distributed i
162c0 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64  n various ways d
162d0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a  epending on the.
162e0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 65 44 65 73  ** value of eDes
162f0 74 20 61 6e 64 20 69 50 61 72 6d 2e 0a 2a 2a 0a  t and iParm..**.
16300 2a 2a 20 20 20 20 20 65 44 65 73 74 20 56 61 6c  **     eDest Val
16310 75 65 20 20 20 20 20 20 20 52 65 73 75 6c 74 0a  ue       Result.
16320 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
16330 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 61  --.**     SRT_Ca
16370 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b 65  llback    Invoke
16380 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f   the callback fo
16390 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68  r each row of th
163a0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
163b0 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
163c0 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74 20      Store first 
163d0 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72 79  result in memory
163e0 20 63 65 6c 6c 20 69 50 61 72 6d 0a 2a 2a 0a 2a   cell iParm.**.*
163f0 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20  *     SRT_Set   
16400 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
16410 6c 74 73 20 61 73 20 6b 65 79 73 20 6f 66 20 74  lts as keys of t
16420 61 62 6c 65 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  able iParm..**.*
16430 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
16440 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
16450 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
16460 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
16470 65 20 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  e iParm.**.**   
16480 20 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20    SRT_Except    
16490 20 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73    Remove results
164a0 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72   from the tempor
164b0 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
164c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54  .**.**     SRT_T
164d0 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65  able       Store
164e0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70   results in temp
164f0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
16500 6d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  m.**.** The tabl
16510 65 20 61 62 6f 76 65 20 69 73 20 69 6e 63 6f 6d  e above is incom
16520 70 6c 65 74 65 2e 20 20 41 64 64 69 74 69 6f 6e  plete.  Addition
16530 61 6c 20 65 44 69 73 74 20 76 61 6c 75 65 20 68  al eDist value h
16540 61 76 65 20 62 65 20 61 64 64 65 64 0a 2a 2a 20  ave be added.** 
16550 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6d 6d 65  since this comme
16560 6e 74 20 77 61 73 20 77 72 69 74 74 65 6e 2e 20  nt was written. 
16570 20 53 65 65 20 74 68 65 20 73 65 6c 65 63 74 49   See the selectI
16580 6e 6e 65 72 4c 6f 6f 70 28 29 20 66 75 6e 63 74  nnerLoop() funct
16590 69 6f 6e 20 66 6f 72 0a 2a 2a 20 61 20 63 6f 6d  ion for.** a com
165a0 70 6c 65 74 65 20 6c 69 73 74 69 6e 67 20 6f 66  plete listing of
165b0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 76 61 6c   the allowed val
165c0 75 65 73 20 6f 66 20 65 44 65 73 74 20 61 6e 64  ues of eDest and
165d0 20 74 68 65 69 72 20 6d 65 61 6e 69 6e 67 73 2e   their meanings.
165e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
165f0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
16600 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
16610 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
16620 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
16630 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
16640 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
16650 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
16660 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
16670 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
16680 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
16690 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
166a0 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
166b0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
166c0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
166d0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
166e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
166f0 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c 20  ent, parentTab, 
16700 61 6e 64 20 2a 70 50 61 72 65 6e 74 41 67 67 20  and *pParentAgg 
16710 66 69 65 6c 64 73 20 61 72 65 20 66 69 6c 6c 65  fields are fille
16720 64 20 69 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  d in if this.** 
16730 53 45 4c 45 43 54 20 69 73 20 61 20 73 75 62 71  SELECT is a subq
16740 75 65 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74  uery.  This rout
16750 69 6e 65 20 6d 61 79 20 74 72 79 20 74 6f 20 63  ine may try to c
16760 6f 6d 62 69 6e 65 20 74 68 69 73 20 53 45 4c 45  ombine this SELE
16770 43 54 0a 2a 2a 20 77 69 74 68 20 69 74 73 20 70  CT.** with its p
16780 61 72 65 6e 74 20 74 6f 20 66 6f 72 6d 20 61 20  arent to form a 
16790 73 69 6e 67 6c 65 20 66 6c 61 74 20 71 75 65 72  single flat quer
167a0 79 2e 20 20 49 6e 20 73 6f 20 64 6f 69 6e 67 2c  y.  In so doing,
167b0 20 69 74 20 6d 69 67 68 74 0a 2a 2a 20 63 68 61   it might.** cha
167c0 6e 67 65 20 74 68 65 20 70 61 72 65 6e 74 20 71  nge the parent q
167d0 75 65 72 79 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  uery from a non-
167e0 61 67 67 72 65 67 61 74 65 20 74 6f 20 61 6e 20  aggregate to an 
167f0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
16800 0a 2a 2a 20 46 6f 72 20 74 68 61 74 20 72 65 61  .** For that rea
16810 73 6f 6e 2c 20 74 68 65 20 70 50 61 72 65 6e 74  son, the pParent
16820 41 67 67 20 66 6c 61 67 20 69 73 20 70 61 73 73  Agg flag is pass
16830 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2c  ed as a pointer,
16840 20 73 6f 20 69 74 0a 2a 2a 20 63 61 6e 20 62 65   so it.** can be
16850 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
16860 45 78 61 6d 70 6c 65 20 31 3a 20 20 20 54 68 65  Example 1:   The
16870 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
16880 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65  pParent paramete
16890 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  r..**.**    SELE
168a0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4a 4f 49  CT * FROM t1 JOI
168b0 4e 20 28 53 45 4c 45 43 54 20 78 2c 20 63 6f 75  N (SELECT x, cou
168c0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 4a  nt(*) FROM t2) J
168d0 4f 49 4e 20 74 33 3b 0a 2a 2a 20 20 20 20 5c 20  OIN t3;.**    \ 
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168f0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 20 73 75       \_______ su
16900 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 2f 20  bquery _______/ 
16910 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
16920 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 20 20 20 20 20 2f 0a 2a 2a 20 20 20 20 20         /.**     
16960 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
16970 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
16980 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
16990 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 0a 2a 2a 20 54 68  ______/.**.** Th
169a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
169b0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 6f 75 74  lled for the out
169c0 65 72 20 71 75 65 72 79 20 66 69 72 73 74 2e 20  er query first. 
169d0 20 20 46 6f 72 20 74 68 61 74 20 63 61 6c 6c 2c    For that call,
169e0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 77 69 6c 6c  .** pParent will
169f0 20 62 65 20 4e 55 4c 4c 2e 20 20 44 75 72 69 6e   be NULL.  Durin
16a00 67 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  g the processing
16a10 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
16a20 65 72 79 2c 20 74 68 69 73 20 0a 2a 2a 20 72 6f  ery, this .** ro
16a30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16a40 72 65 63 75 72 73 69 76 65 6c 79 20 74 6f 20 68  recursively to h
16a50 61 6e 64 6c 65 20 74 68 65 20 73 75 62 71 75 65  andle the subque
16a60 72 79 2e 20 20 46 6f 72 20 74 68 65 20 72 65 63  ry.  For the rec
16a70 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 2c 20  ursive.** call, 
16a80 70 50 61 72 65 6e 74 20 77 69 6c 6c 20 70 6f 69  pParent will poi
16a90 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  nt to the outer 
16aa0 71 75 65 72 79 2e 20 20 42 65 63 61 75 73 65 20  query.  Because 
16ab0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a  the subquery is.
16ac0 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  ** the second el
16ad0 65 6d 65 6e 74 20 69 6e 20 61 20 74 68 72 65 65  ement in a three
16ae0 2d 77 61 79 20 6a 6f 69 6e 2c 20 74 68 65 20 70  -way join, the p
16af0 61 72 65 6e 74 54 61 62 20 70 61 72 61 6d 65 74  arentTab paramet
16b00 65 72 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 31 20  er will.** be 1 
16b10 28 74 68 65 20 32 6e 64 20 76 61 6c 75 65 20 6f  (the 2nd value o
16b20 66 20 61 20 30 2d 69 6e 64 65 78 65 64 20 61 72  f a 0-indexed ar
16b30 72 61 79 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ray.).*/.int sql
16b40 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
16b50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
16b60 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
16b70 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
16b80 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
16b90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
16ba0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
16bb0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
16bc0 20 69 6e 74 20 65 44 65 73 74 2c 20 20 20 20 20   int eDest,     
16bd0 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74          /* How t
16be0 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
16bf0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
16c00 74 20 69 50 61 72 6d 2c 20 20 20 20 20 20 20 20  t iParm,        
16c10 20 20 20 20 20 2f 2a 20 41 20 70 61 72 61 6d 65       /* A parame
16c20 74 65 72 20 75 73 65 64 20 62 79 20 74 68 65 20  ter used by the 
16c30 65 44 65 73 74 20 64 69 73 70 6f 73 61 6c 20 6d  eDest disposal m
16c40 65 74 68 6f 64 20 2a 2f 0a 20 20 53 65 6c 65 63  ethod */.  Selec
16c50 74 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  t *pParent,     
16c60 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
16c70 45 43 54 20 66 6f 72 20 77 68 69 63 68 20 74 68  ECT for which th
16c80 69 73 20 69 73 20 61 20 73 75 62 2d 71 75 65 72  is is a sub-quer
16c90 79 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e  y */.  int paren
16ca0 74 54 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  tTab,         /*
16cb0 20 49 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e   Index in pParen
16cc0 74 2d 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20  t->pSrc of this 
16cd0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  query */.  int *
16ce0 70 50 61 72 65 6e 74 41 67 67 2c 20 20 20 20 20  pParentAgg,     
16cf0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
16d00 72 65 6e 74 20 75 73 65 73 20 61 67 67 72 65 67  rent uses aggreg
16d10 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
16d20 0a 20 20 63 68 61 72 20 2a 61 66 66 20 20 20 20  .  char *aff    
16d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
16d40 65 44 65 73 74 20 69 73 20 53 52 54 5f 55 6e 69  eDest is SRT_Uni
16d50 6f 6e 2c 20 74 68 65 20 61 66 66 69 6e 69 74 79  on, the affinity
16d60 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
16d70 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
16d80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
16d90 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
16da0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
16db0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72      /* Return fr
16dc0 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  om sqlite3WhereB
16dd0 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65  egin() */.  Vdbe
16de0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
16df0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
16e00 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20  l machine under 
16e10 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
16e20 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20    int isAgg;    
16e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16e40 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74   for select list
16e50 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29  s like "count(*)
16e60 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  " */.  ExprList 
16e70 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  *pEList;      /*
16e80 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   List of columns
16e90 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a   to extract. */.
16ea0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
16eb0 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist;     /* List
16ec0 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65   of tables to se
16ed0 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45  lect from */.  E
16ee0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
16ef0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
16f00 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  RE clause.  May 
16f10 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
16f20 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
16f30 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
16f40 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
16f50 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
16f60 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
16f70 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
16f80 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
16f90 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
16fa0 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
16fb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
16fc0 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
16fd0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
16fe0 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20  t isDistinct;   
16ff0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17000 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
17010 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
17020 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63  */.  int distinc
17030 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
17040 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20  able to use for 
17050 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
17060 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
17070 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17080 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
17090 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
170a0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
170b0 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
170c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
170d0 4f 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 69  OP_OpenVirtual i
170e0 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
170f0 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
17100 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
17110 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
17120 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
17130 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
17140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17150 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
17160 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
17170 2f 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  /..  if( p==0 ||
17180 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61   sqlite3MallocFa
17190 69 6c 65 64 28 29 20 7c 7c 20 70 50 61 72 73 65  iled() || pParse
171a0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
171b0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
171c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
171d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
171e0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
171f0 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
17200 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
17210 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
17220 67 49 6e 66 6f 29 29 3b 0a 0a 23 69 66 6e 64 65  gInfo));..#ifnde
17230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
17240 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
17250 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
17260 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  re a sequence of
17270 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65   queries, do the
17280 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69   earlier ones fi
17290 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rst..  */.  if( 
172a0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
172b0 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f   if( p->pRightmo
172c0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  st==0 ){.      S
172d0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 0a 20 20  elect *pLoop;.  
172e0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
172f0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
17300 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
17310 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
17320 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
17330 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
17340 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
17350 74 28 70 50 61 72 73 65 2c 20 70 2c 20 65 44 65  t(pParse, p, eDe
17360 73 74 2c 20 69 50 61 72 6d 2c 20 61 66 66 29 3b  st, iParm, aff);
17370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
17380 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
17390 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e  derBy;.  if( Ign
173a0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65 44  orableOrderby(eD
173b0 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70  est) ){.    p->p
173c0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
173d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
173e0 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50 61 72  lectResolve(pPar
173f0 73 65 2c 20 70 2c 20 30 29 20 29 7b 0a 20 20 20  se, p, 0) ){.   
17400 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
17410 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65  ;.  }.  p->pOrde
17420 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
17430 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c  .  /* Make local
17440 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
17450 61 72 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68  arameters for th
17460 69 73 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  is query..  */. 
17470 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
17480 53 72 63 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  Src;.  pWhere = 
17490 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
174a0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
174b0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
174c0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
174d0 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
174e0 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
174f0 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
17500 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
17510 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
17520 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  t==0 ) goto sele
17530 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20  ct_end;..  /* . 
17540 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20   ** Do not even 
17550 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72  attempt to gener
17560 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20  ate any code if 
17570 77 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  we have already 
17580 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73  seen.  ** errors
17590 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
175a0 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a  tine starts..  *
175b0 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
175c0 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65  nErr>0 ) goto se
175d0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
175e0 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
175f0 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
17600 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
17610 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
17620 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
17630 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
17640 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17650 45 52 59 0a 20 20 69 66 28 20 28 65 44 65 73 74  ERY.  if( (eDest
17660 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
17670 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 26 26 20  st==SRT_Set) && 
17680 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20  pEList->nExpr>1 
17690 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
176a0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
176b0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
176c0 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
176d0 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
176e0 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
176f0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
17700 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  n");.    goto se
17710 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
17720 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  ndif..  /* ORDER
17730 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
17740 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
17750 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
17760 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
17770 79 28 65 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(eDest) ){.    
17780 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
17790 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
177a0 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
177b0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
177c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
177d0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
177e0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
177f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
17800 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
17810 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
17820 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
17830 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
17840 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17850 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
17860 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
17870 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
17880 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
17890 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
178a0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
178b0 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  ntext = 0;.    i
178c0 6e 74 20 6e 65 65 64 52 65 73 74 6f 72 65 43 6f  nt needRestoreCo
178d0 6e 74 65 78 74 3b 0a 20 20 20 20 73 74 72 75 63  ntext;.    struc
178e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
178f0 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
17900 74 2d 3e 61 5b 69 5d 3b 0a 0a 20 20 20 20 69 66  t->a[i];..    if
17910 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
17920 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
17930 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
17940 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
17950 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
17960 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
17970 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  thContext;.     
17980 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
17990 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a  ntext = pItem->z
179a0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 65 65 64  Name;.      need
179b0 52 65 73 74 6f 72 65 43 6f 6e 74 65 78 74 20 3d  RestoreContext =
179c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
179d0 20 20 20 20 20 6e 65 65 64 52 65 73 74 6f 72 65       needRestore
179e0 43 6f 6e 74 65 78 74 20 3d 20 30 3b 0a 20 20 20  Context = 0;.   
179f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65   }.    sqlite3Se
17a00 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74  lect(pParse, pIt
17a10 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  em->pSelect, SRT
17a20 5f 56 69 72 74 75 61 6c 54 61 62 2c 20 0a 20 20  _VirtualTab, .  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17a40 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
17a50 2c 20 69 2c 20 26 69 73 41 67 67 2c 20 30 29 3b  , i, &isAgg, 0);
17a60 0a 20 20 20 20 69 66 28 20 6e 65 65 64 52 65 73  .    if( needRes
17a70 74 6f 72 65 43 6f 6e 74 65 78 74 20 29 7b 0a 20  toreContext ){. 
17a80 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
17a90 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
17aa0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  edAuthContext;. 
17ab0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
17ac0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
17ad0 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68   pWhere = p->pWh
17ae0 65 72 65 3b 0a 20 20 20 20 69 66 28 20 21 49 67  ere;.    if( !Ig
17af0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 65  norableOrderby(e
17b00 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
17b10 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
17b20 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 20  derBy;.    }.   
17b30 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
17b40 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 48 61  GroupBy;.    pHa
17b50 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
17b60 67 3b 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63  g;.    isDistinc
17b70 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  t = p->isDistinc
17b80 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
17b90 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68   /* Check for th
17ba0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
17bb0 66 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  f a min() or max
17bc0 28 29 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 69  () function by i
17bd0 74 73 65 6c 66 0a 20 20 2a 2a 20 69 6e 20 74 68  tself.  ** in th
17be0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
17bf0 2a 2f 0a 20 20 69 66 28 20 73 69 6d 70 6c 65 4d  */.  if( simpleM
17c00 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
17c10 65 2c 20 70 2c 20 65 44 65 73 74 2c 20 69 50 61  e, p, eDest, iPa
17c20 72 6d 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rm) ){.    rc = 
17c30 30 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  0;.    goto sele
17c40 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
17c50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
17c60 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71  f this is a subq
17c70 75 65 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  uery that can be
17c80 20 22 66 6c 61 74 74 65 6e 65 64 22 20 69 6e 74   "flattened" int
17c90 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  o its parent..  
17ca0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
17cb0 20 69 73 20 61 20 70 6f 73 73 69 62 6c 69 74 79   is a possiblity
17cc0 2c 20 64 6f 20 73 6f 20 61 6e 64 20 72 65 74 75  , do so and retu
17cd0 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  rn immediately. 
17ce0 20 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53   .  */.#ifndef S
17cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
17d00 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 26 26    if( pParent &&
17d10 20 70 50 61 72 65 6e 74 41 67 67 20 26 26 0a 20   pParentAgg &&. 
17d20 20 20 20 20 20 66 6c 61 74 74 65 6e 53 75 62 71       flattenSubq
17d30 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 50 61  uery(pParse, pPa
17d40 72 65 6e 74 2c 20 70 61 72 65 6e 74 54 61 62 2c  rent, parentTab,
17d50 20 2a 70 50 61 72 65 6e 74 41 67 67 2c 20 69 73   *pParentAgg, is
17d60 41 67 67 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Agg) ){.    if( 
17d70 69 73 41 67 67 20 29 20 2a 70 50 61 72 65 6e 74  isAgg ) *pParent
17d80 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  Agg = 1;.    got
17d90 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
17da0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
17db0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
17dc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 72  DER BY clause, r
17dd0 65 73 6f 6c 76 65 20 61 6e 79 20 63 6f 6c 6c 61  esolve any colla
17de0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 0a 20  tion sequences. 
17df0 20 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 68   ** names that h
17e00 61 76 65 20 62 65 65 6e 20 65 78 70 6c 69 63 69  ave been explici
17e10 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 61 6e  tly specified an
17e20 64 20 63 72 65 61 74 65 20 61 20 73 6f 72 74 69  d create a sorti
17e30 6e 67 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  ng index..  **. 
17e40 20 2a 2a 20 54 68 69 73 20 73 6f 72 74 69 6e 67   ** This sorting
17e50 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
17e60 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64   up being unused
17e70 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
17e80 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63   be .  ** extrac
17e90 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
17ea0 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61  d order.  If tha
17eb0 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  t is the case, t
17ec0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  hen the.  ** OP_
17ed0 4f 70 65 6e 56 69 72 74 75 61 6c 20 69 6e 73 74  OpenVirtual inst
17ee0 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
17ef0 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
17f00 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
17f10 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
17f20 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
17f30 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
17f40 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
17f50 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
17f60 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
17f70 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
17f80 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
17f90 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
17fa0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
17fb0 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 0a  st_item *pTerm;.
17fc0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
17fd0 79 49 6e 66 6f 3b 0a 20 20 20 20 66 6f 72 28 69  yInfo;.    for(i
17fe0 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72  =0, pTerm=pOrder
17ff0 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
18000 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
18010 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
18020 66 28 20 70 54 65 72 6d 2d 3e 7a 4e 61 6d 65 20  f( pTerm->zName 
18030 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
18040 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d  ->pExpr->pColl =
18050 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
18060 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
18070 65 72 6d 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b  erm->zName, -1);
18080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18090 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
180a0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Err ){.      got
180b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
180c0 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f    }.    pKeyInfo
180d0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
180e0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
180f0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
18100 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
18110 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
18120 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
18130 65 6e 56 69 72 74 5b 32 5d 20 3d 20 61 64 64 72  enVirt[2] = addr
18140 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
18150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
18160 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 56 69 72 74  3(v, OP_OpenVirt
18170 75 61 6c 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ual, pOrderBy->i
18180 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42  ECursor, pOrderB
18190 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 0a 20 20 20  y->nExpr+2, .   
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
181c0 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
181d0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
181e0 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74  se{.    addrSort
181f0 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
18200 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
18210 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
18220 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18230 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18240 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
18250 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
18260 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 49 66   iEnd);..  /* If
18270 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
18280 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
18290 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
182a0 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
182b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 44 65 73 74    */.  if( eDest
182c0 3d 3d 53 52 54 5f 56 69 72 74 75 61 6c 54 61 62  ==SRT_VirtualTab
182d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
182e0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
182f0 70 65 6e 56 69 72 74 75 61 6c 2c 20 69 50 61 72  penVirtual, iPar
18300 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
18310 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  );.  }..  /* Ope
18320 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
18330 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
18340 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
18350 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
18360 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
18370 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
18380 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70 50     distinct = pP
18390 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
183a0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
183b0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
183c0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
183d0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
183e0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  VdbeOp3(v, OP_Op
183f0 65 6e 56 69 72 74 75 61 6c 2c 20 64 69 73 74 69  enVirtual, disti
18400 6e 63 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  nct, 0, .       
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
18430 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P3_KEYINFO_HAN
18440 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
18450 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
18460 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
18470 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
18480 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
18490 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
184a0 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
184b0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
184c0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
184d0 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66  * This case is f
184e0 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  or non-aggregate
184f0 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20   queries.    ** 
18500 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
18510 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20  se scan.    */. 
18520 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
18530 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
18540 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
18550 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
18560 79 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  y);.    if( pWIn
18570 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
18580 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
18590 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
185a0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
185b0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
185c0 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 0a 20 20  _OpenVirtual .  
185d0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
185e0 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
185f0 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
18600 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
18610 70 65 6e 56 69 72 74 75 61 6c 0a 20 20 20 20 2a  penVirtual.    *
18620 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
18630 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
18640 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  ( addrSortIndex>
18650 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d  =0 && pOrderBy==
18660 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 63 72 65  0 ){.      uncre
18670 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78 28  ateSortingIndex(
18680 70 50 61 72 73 65 2c 20 61 64 64 72 53 6f 72 74  pParse, addrSort
18690 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d  Index);.      p-
186a0 3e 61 64 64 72 4f 70 65 6e 56 69 72 74 5b 32 5d  >addrOpenVirt[2]
186b0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
186c0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
186d0 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
186e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
186f0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
18700 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
18710 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
18720 79 2c 20 64 69 73 74 69 6e 63 74 2c 20 65 44 65  y, distinct, eDe
18730 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
18740 20 20 20 20 20 20 20 20 69 50 61 72 6d 2c 20 70          iParm, p
18750 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
18760 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
18770 2c 20 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20  , aff) ){.      
18780 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
18790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
187a0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
187b0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
187c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
187d0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
187e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
187f0 54 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63  This is the proc
18800 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
18810 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
18820 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
18830 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
18840 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
18850 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
18860 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
18870 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
18880 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
18890 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
188a0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
188b0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
188c0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
188d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
188e0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
188f0 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
18900 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
18910 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
18920 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
18930 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
18940 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
18970 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
18980 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
18990 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
189c0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
189d0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
189e0 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
189f0 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
18a00 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
18a10 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
18a20 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
18a30 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
18a40 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
18a50 72 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  rder */...    /*
18a60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
18a70 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64  ariables hold ad
18a80 64 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c  dresses or label
18a90 73 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74  s for parts of t
18aa0 68 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  he.    ** virtua
18ab0 6c 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61  l machine progra
18ac0 6d 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67  m we are putting
18ad0 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20   together */.   
18ae0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
18af0 6f 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72  ow;      /* Star
18b00 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20  t of subroutine 
18b10 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72  that outputs a r
18b20 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20  esult row */.   
18b30 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72   int addrSetAbor
18b40 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  t;       /* Set 
18b50 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
18b60 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
18b70 20 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c   int addrInitial
18b80 69 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72  izeLoop; /* Star
18b90 74 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69  t of code that i
18ba0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69  nitializes the i
18bb0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
18bc0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
18bd0 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  op;      /* Top 
18be0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
18bf0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  p */.    int add
18c00 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 3b 20  rGroupByChange; 
18c10 20 2f 2a 20 43 6f 64 65 20 74 68 61 74 20 72 75   /* Code that ru
18c20 6e 73 20 77 68 65 6e 20 61 6e 79 20 47 52 4f 55  ns when any GROU
18c30 50 20 42 59 20 74 65 72 6d 20 63 68 61 6e 67 65  P BY term change
18c40 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  s */.    int add
18c50 72 50 72 6f 63 65 73 73 52 6f 77 3b 20 20 20 20  rProcessRow;    
18c60 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 72 6f 63   /* Code to proc
18c70 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 70  ess a single inp
18c80 75 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  ut row */.    in
18c90 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
18ca0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
18cb0 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  all processing *
18cc0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f  /.    int addrSo
18cd0 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f 2a  rtingIdx;     /*
18ce0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 56 69 72 74   The OP_OpenVirt
18cf0 75 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ual for the sort
18d00 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
18d10 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
18d20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
18d30 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
18d40 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
18d50 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 61 64 64  ator */..    add
18d60 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
18d70 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
18d80 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
18d90 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
18da0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
18db0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
18dc0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
18dd0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
18de0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
18df0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
18e00 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
18e10 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
18e20 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
18e30 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
18e40 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
18e50 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
18e60 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
18e70 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
18e80 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
18e90 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
18ea0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
18eb0 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
18ec0 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
18ed0 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
18ee0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
18ef0 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
18f00 79 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  y;.    if( sqlit
18f10 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
18f20 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
18f30 74 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  t) ){.      goto
18f40 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
18f50 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
18f60 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
18f70 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65  List(&sNC, pOrde
18f80 72 42 79 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rBy) ){.      go
18f90 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
18fa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 48 61     }.    if( pHa
18fb0 76 69 6e 67 20 26 26 20 73 71 6c 69 74 65 33 45  ving && sqlite3E
18fc0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
18fd0 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
18fe0 6e 67 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ng) ){.      got
18ff0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
19000 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
19010 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
19020 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
19030 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19040 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
19050 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
19060 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
19070 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
19080 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
19090 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  i].pExpr->pList)
190a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
190b0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
190c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
190d0 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
190e0 46 61 69 6c 65 64 28 29 20 29 20 67 6f 74 6f 20  Failed() ) goto 
190f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
19100 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
19110 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
19120 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
19130 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
19140 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
19150 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 20 61  re complex tha a
19160 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
19170 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
19180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
19190 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
191a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
191b0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
191c0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
191d0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
191e0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72   */..      /* Cr
191f0 65 61 74 65 20 6c 61 62 65 6c 73 20 74 68 61 74  eate labels that
19200 20 77 65 20 77 69 6c 6c 20 62 65 20 6e 65 65 64   we will be need
19210 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
19220 20 20 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69    .      addrIni
19230 74 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71  tializeLoop = sq
19240 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19250 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  el(v);.      add
19260 72 47 72 6f 75 70 42 79 43 68 61 6e 67 65 20 3d  rGroupByChange =
19270 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19280 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19290 61 64 64 72 50 72 6f 63 65 73 73 52 6f 77 20 3d  addrProcessRow =
192a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
192b0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 20  Label(v);..     
192c0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
192d0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
192e0 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
192f0 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
19300 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
19310 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
19320 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
19330 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
19340 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
19350 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
19360 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
19370 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e  er all, the Open
19380 56 69 72 74 75 61 6c 20 69 6e 73 74 72 75 63 74  Virtual instruct
19390 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ion.      ** wil
193a0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
193b0 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20  nto a Noop.  .  
193c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67      */.      sAg
193d0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
193e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
193f0 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  +;.      pKeyInf
19400 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
19410 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
19420 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20  pGroupBy);.     
19430 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
19440 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
19450 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
19460 5f 4f 70 65 6e 56 69 72 74 75 61 6c 2c 20 73 41  _OpenVirtual, sA
19470 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
19480 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
19490 20 20 20 20 20 20 20 20 20 20 20 20 73 41 67 67              sAgg
194a0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
194b0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
194d0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
194e0 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
194f0 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  F);..      /* In
19500 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
19510 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
19520 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
19530 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
19540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19550 55 73 65 46 6c 61 67 20 3d 20 70 50 61 72 73 65  UseFlag = pParse
19560 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
19570 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 70 50 61  iAbortFlag = pPa
19580 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
19590 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
195a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
195b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
195c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
195d0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
195e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
195f0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19600 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
19610 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
19620 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
19630 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 41 62 6f 72  MemInt, 0, iAbor
19640 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
19650 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
19660 20 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61   clear abort fla
19670 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
19680 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
19690 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c 20 69 55  OP_MemInt, 0, iU
196a0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
196b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
196c0 23 20 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d  # indicate accum
196d0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
196e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
196f0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
19700 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69  to, 0, addrIniti
19710 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20  alizeLoop);..   
19720 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
19730 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
19740 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
19750 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
19760 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
19770 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
19780 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
19790 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
197a0 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
197b0 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
197c0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
197d0 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
197e0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
197f0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
19800 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
19810 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
19820 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
19830 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
19840 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
19850 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
19860 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
19870 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
19880 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
19890 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
198a0 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
198b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
198c0 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
198d0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
198e0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
198f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
19900 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20  , OP_MemInt, 1, 
19910 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
19920 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
19930 76 2c 20 22 23 20 73 65 74 20 61 62 6f 72 74 20  v, "# set abort 
19940 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
19950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
19960 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30 2c  v, OP_Return, 0,
19970 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f   0);.      addrO
19980 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
19990 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
199a0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
199b0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
199c0 4f 50 5f 49 66 4d 65 6d 50 6f 73 2c 20 69 55 73  OP_IfMemPos, iUs
199d0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
199e0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
199f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19a00 23 20 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74  # Groupby result
19a10 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
19a20 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
19a30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19a40 70 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  p(v, OP_Return, 
19a50 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 69 6e  0, 0);.      fin
19a60 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
19a70 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
19a80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
19a90 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
19aa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
19ab0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
19ac0 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
19ad0 74 52 6f 77 2b 31 2c 20 31 29 3b 0a 20 20 20 20  tRow+1, 1);.    
19ae0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
19af0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
19b00 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
19b10 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
19b20 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 64 69 73 74 69 6e 63 74 2c 20 65 44 65 73 74 2c  distinct, eDest,
19b50 20 69 50 61 72 6d 2c 20 0a 20 20 20 20 20 20 20   iParm, .       
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
19b80 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
19b90 74 2c 20 61 66 66 29 3b 0a 20 20 20 20 20 20 69  t, aff);.      i
19ba0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
19bb0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
19bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19be0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30  (v, OP_Return, 0
19bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 0);.      Vdbe
19c00 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 65  Comment((v, "# e
19c10 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
19c20 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
19c30 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
19c40 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19c50 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
19c60 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
19c70 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
19c80 2f 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  /.      addrRese
19c90 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
19ca0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19cb0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
19cc0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
19cd0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
19ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19cf0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 30  (v, OP_Return, 0
19d00 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  , 0);..      /* 
19d10 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
19d20 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
19d30 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
19d40 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
19d50 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
19d60 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
19d70 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
19d80 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
19d90 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
19da0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
19db0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
19dc0 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
19dd0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
19de0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
19df0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
19e00 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
19e10 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
19e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19e30 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19e40 2c 20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65  , addrInitialize
19e50 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
19e60 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
19e70 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64   OP_Gosub, 0, ad
19e80 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
19e90 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
19ea0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
19eb0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
19ec0 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79 29 3b  ere, &pGroupBy);
19ed0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
19ee0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
19ef0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
19f00 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
19f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
19f20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
19f30 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
19f40 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
19f50 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
19f60 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
19f70 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
19f80 50 5f 4f 70 65 6e 56 69 72 74 75 61 6c 20 74 61  P_OpenVirtual ta
19f90 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
19fa0 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
19fb0 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
19fc0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
19fd0 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
19fe0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
19ff0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1a000 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1a010 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
1a020 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1a030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
1a040 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
1a050 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
1a060 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
1a070 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
1a080 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
1a090 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
1a0a0 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
1a0b0 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
1a0c0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
1a0d0 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
1a0e0 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
1a0f0 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
1a100 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
1a110 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
1a120 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a130 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
1a140 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
1a150 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
1a160 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
1a170 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pBy);.        sq
1a180 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a190 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73  , OP_Sequence, s
1a1a0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
1a1b0 64 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  dx, 0);.        
1a1c0 6a 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  j = pGroupBy->nE
1a1d0 78 70 72 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  xpr+1;.        f
1a1e0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
1a1f0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
1a200 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
1a210 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
1a220 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
1a230 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
1a240 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
1a250 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 6a 20 29 20  orterColumn<j ) 
1a260 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a270 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 43      if( pCol->iC
1a280 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1a290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a2a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
1a2b0 77 69 64 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  wid, pCol->iTabl
1a2c0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
1a2d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a2f0 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
1a300 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
1a310 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 29 3b   pCol->iColumn);
1a320 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a330 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
1a340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1a350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
1a360 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
1a370 20 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   j, 0);.        
1a380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a390 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
1a3a0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
1a3b0 6e 67 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 20  ngIdx, 0);.     
1a3c0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1a3d0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
1a3e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a3f0 64 64 4f 70 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  ddOp(v, OP_Sort,
1a400 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1a410 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
1a420 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
1a430 65 6e 74 28 28 76 2c 20 22 23 20 47 52 4f 55 50  ent((v, "# GROUP
1a440 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20   BY sort"));.   
1a450 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
1a460 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
1a470 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a480 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
1a490 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
1a4a0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
1a4b0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
1a4c0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
1a4d0 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
1a4e0 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
1a4f0 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
1a500 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
1a510 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
1a520 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
1a530 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
1a540 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
1a550 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
1a560 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
1a570 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
1a580 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
1a590 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
1a5a0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
1a5b0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
1a5c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1a5d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1a5e0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
1a5f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
1a600 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
1a610 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1a620 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1a630 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49  OP_Column, sAggI
1a640 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
1a650 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
1a660 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
1a670 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
1a680 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1a690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1a6a0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
1a6b0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[j].pExpr);. 
1a6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a6d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a6e0 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
1a6f0 2c 20 69 42 4d 65 6d 2b 6a 2c 20 6a 3c 70 47 72  , iBMem+j, j<pGr
1a700 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
1a710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1a720 6f 72 28 6a 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(j=pGroupBy->n
1a730 45 78 70 72 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Expr-1; j>=0; j-
1a740 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
1a750 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
1a760 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r-1 ){.         
1a770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a780 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
1a790 20 69 42 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20   iBMem+j, 0);.  
1a7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a7b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7c0 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
1a7d0 69 41 4d 65 6d 2b 6a 2c 20 30 29 3b 0a 20 20 20  iAMem+j, 0);.   
1a7e0 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 7b       if( j==0 ){
1a7f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1a800 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
1a810 50 5f 45 71 2c 20 30 78 32 30 30 2c 20 61 64 64  P_Eq, 0x200, add
1a820 72 50 72 6f 63 65 73 73 52 6f 77 29 3b 0a 20 20  rProcessRow);.  
1a830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a850 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
1a860 2c 20 30 78 32 30 30 2c 20 61 64 64 72 47 72 6f  , 0x200, addrGro
1a870 75 70 42 79 43 68 61 6e 67 65 29 3b 0a 20 20 20  upByChange);.   
1a880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
1a890 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1a8a0 50 33 28 76 2c 20 2d 31 2c 20 28 76 6f 69 64 2a  P3(v, -1, (void*
1a8b0 29 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  )pKeyInfo->aColl
1a8c0 5b 6a 5d 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29  [j], P3_COLLSEQ)
1a8d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a8e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a8f0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
1a900 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
1a910 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
1a920 20 2a 2a 20 43 68 61 6e 67 65 20 69 6e 20 74 68   ** Change in th
1a930 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
1a940 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
1a950 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
1a960 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
1a970 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
1a980 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
1a990 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
1a9a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a9b0 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
1a9c0 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
1a9d0 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
1a9e0 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
1a9f0 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
1aa00 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
1aa10 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
1aa20 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
1aa30 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
1aa40 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1aa50 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1aa60 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
1aa70 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
1aa80 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
1aa90 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
1aaa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aab0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1aac0 61 64 64 72 47 72 6f 75 70 42 79 43 68 61 6e 67  addrGroupByChang
1aad0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
1aae0 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
1aaf0 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
1ab00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ab10 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4d 6f  ddOp(v, OP_MemMo
1ab20 76 65 2c 20 69 41 4d 65 6d 2b 6a 2c 20 69 42 4d  ve, iAMem+j, iBM
1ab30 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  em+j);.      }. 
1ab40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ab50 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75  AddOp(v, OP_Gosu
1ab60 62 2c 20 30 2c 20 61 64 64 72 4f 75 74 70 75 74  b, 0, addrOutput
1ab70 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
1ab80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6f  Comment((v, "# o
1ab90 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
1aba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1abb0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
1abc0 66 4d 65 6d 50 6f 73 2c 20 69 41 62 6f 72 74 46  fMemPos, iAbortF
1abd0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
1abe0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1abf0 28 28 76 2c 20 22 23 20 63 68 65 63 6b 20 61 62  ((v, "# check ab
1ac00 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
1ac10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ac20 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  dOp(v, OP_Gosub,
1ac30 20 30 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a   0, addrReset);.
1ac40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
1ac50 74 28 28 76 2c 20 22 23 20 72 65 73 65 74 20 61  t((v, "# reset a
1ac60 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
1ac70 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1ac80 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1ac90 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
1aca0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
1acb0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
1acc0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
1acd0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1ace0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1acf0 65 6c 28 76 2c 20 61 64 64 72 50 72 6f 63 65 73  el(v, addrProces
1ad00 73 52 6f 77 29 3b 0a 20 20 20 20 20 20 75 70 64  sRow);.      upd
1ad10 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
1ad20 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
1ad30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ad40 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1ad50 4d 65 6d 49 6e 74 2c 20 31 2c 20 69 55 73 65 46  MemInt, 1, iUseF
1ad60 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
1ad70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69  Comment((v, "# i
1ad80 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
1ad90 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
1ada0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
1adb0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
1adc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
1add0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
1ade0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1adf0 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  ddOp(v, OP_Next,
1ae00 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
1ae10 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
1ae20 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
1ae30 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1ae40 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
1ae50 6f 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 63 72  o);.        uncr
1ae60 65 61 74 65 53 6f 72 74 69 6e 67 49 6e 64 65 78  eateSortingIndex
1ae70 28 70 50 61 72 73 65 2c 20 61 64 64 72 53 6f 72  (pParse, addrSor
1ae80 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20  tingIdx);.      
1ae90 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  }..      /* Outp
1aea0 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ut the final row
1aeb0 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20   of result.     
1aec0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1aed0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1aee0 5f 47 6f 73 75 62 2c 20 30 2c 20 61 64 64 72 4f  _Gosub, 0, addrO
1aef0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
1af00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1af10 20 22 23 20 6f 75 74 70 75 74 20 66 69 6e 61 6c   "# output final
1af20 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a   row"));.      .
1af30 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
1af40 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65  GroupBy */.    e
1af50 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  lse {.      /* T
1af60 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
1af70 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
1af80 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
1af90 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
1afa0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1afb0 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
1afc0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
1afd0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
1afe0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74  .      ** of out
1aff0 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  put..      */.  
1b000 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
1b010 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
1b020 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
1b030 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
1b040 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
1b050 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
1b060 72 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  re, 0);.      if
1b070 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
1b080 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1b090 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
1b0a0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
1b0b0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
1b0c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1b0d0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
1b0e0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1b0f0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
1b100 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ggInfo);.      p
1b110 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1b120 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
1b130 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b140 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1b150 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
1b160 64 72 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20  drEnd, 1);.     
1b170 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49   }.      selectI
1b180 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
1b190 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30   p, p->pEList, 0
1b1a0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a 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 20 65 44 65 73 74 2c 20 69 50 61 72 6d 2c     eDest, iParm,
1b1d0 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
1b1e0 64 2c 20 61 66 66 29 3b 0a 20 20 20 20 7d 0a 20  d, aff);.    }. 
1b1f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b200 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
1b210 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d  drEnd);.    .  }
1b220 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67   /* endif aggreg
1b230 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ate query */..  
1b240 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1b250 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1b260 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20  e, then we need 
1b270 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  to sort the resu
1b280 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e  lts.  ** and sen
1b290 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61  d them to the ca
1b2a0 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e  llback one by on
1b2b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1b2c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65  rderBy ){.    ge
1b2d0 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
1b2e0 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c  Parse, p, v, pEL
1b2f0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 65 44 65 73  ist->nExpr, eDes
1b300 74 2c 20 69 50 61 72 6d 29 3b 0a 20 20 7d 0a 0a  t, iParm);.  }..
1b310 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b320 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 2f  MIT_SUBQUERY.  /
1b330 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
1b340 73 75 62 71 75 65 72 79 2c 20 77 65 20 68 61 76  subquery, we hav
1b350 65 20 6e 6f 77 20 63 6f 6e 76 65 72 74 65 64 20  e now converted 
1b360 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1b370 6f 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  o a.  ** tempora
1b380 72 79 20 74 61 62 6c 65 2e 20 20 53 6f 20 64 65  ry table.  So de
1b390 6c 65 74 65 20 74 68 65 20 73 75 62 71 75 65 72  lete the subquer
1b3a0 79 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  y structure from
1b3b0 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
1b3c0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 69 73   to prevent this
1b3d0 20 73 75 62 71 75 65 72 79 20 66 72 6f 6d 20 62   subquery from b
1b3e0 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20 61  eing evaluated a
1b3f0 67 61 69 6e 20 61 6e 64 20 74 6f 20 66 6f 72 63  gain and to forc
1b400 65 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 75  e the.  ** the u
1b410 73 65 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  se of the tempor
1b420 61 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ary table..  */.
1b430 20 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b    if( pParent ){
1b440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b450 72 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  rent->pSrc->nSrc
1b460 3e 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20  >parentTab );.  
1b470 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1b480 74 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e  t->pSrc->a[paren
1b490 74 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70  tTab].pSelect==p
1b4a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
1b4b0 65 6c 65 63 74 44 65 6c 65 74 65 28 70 29 3b 0a  electDelete(p);.
1b4c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1b4d0 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61 62 5d 2e  c->a[parentTab].
1b4e0 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d  pSelect = 0;.  }
1b4f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4a 75  .#endif..  /* Ju
1b500 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
1b510 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a  this query.  */.
1b520 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b530 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e  olveLabel(v, iEn
1b540 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45  d);..  /* The SE
1b550 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73  LECT was success
1b560 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53  fully coded.   S
1b570 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
1b580 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20  de to 0.  ** to 
1b590 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f  indicate no erro
1b5a0 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  rs..  */.  rc = 
1b5b0 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c  0;..  /* Control
1b5c0 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69   jumps to here i
1b5d0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
1b5e0 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c  countered above,
1b5f0 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75   or upon.  ** su
1b600 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20  ccessful coding 
1b610 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20  of the SELECT.. 
1b620 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a   */.select_end:.
1b630 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
1b640 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 77  olumn names if w
1b650 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20  e will be using 
1b660 74 68 65 6d 20 69 6e 20 61 20 63 61 6c 6c 62 61  them in a callba
1b670 63 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 73  ck.  This.  ** s
1b680 74 65 70 20 69 73 20 73 6b 69 70 70 65 64 20 69  tep is skipped i
1b690 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
1b6a0 67 6f 69 6e 67 20 74 6f 20 73 6f 6d 65 20 6f 74  going to some ot
1b6b0 68 65 72 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  her destination.
1b6c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1b6d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 44 65  SQLITE_OK && eDe
1b6e0 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b  st==SRT_Callback
1b6f0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
1b700 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1b710 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
1b720 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
1b730 6c 69 74 65 46 72 65 65 28 73 41 67 67 49 6e 66  liteFree(sAggInf
1b740 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
1b750 65 46 72 65 65 28 73 41 67 67 49 6e 66 6f 2e 61  eFree(sAggInfo.a
1b760 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
1b770 72 63 3b 0a 7d 0a                                rc;.}.